点击显示按钮时如何在Table View中获取重复联系人?
点击显示按钮时,如何在Table View中获取重复联系人?
嘿,我来帮你把这段代码补全,并且梳理出完整的实现流程,这样点击显示按钮时,就能在Table View里展示出重复的联系人啦!
第一步:准备工作与权限处理
首先要确保你的App已经申请了联系人访问权限,在Info.plist里添加NSContactsUsageDescription键,说明为什么需要访问联系人。然后在代码里处理权限请求,这是访问联系人的前提哦。
第二步:完整的重复联系人查找与展示实现
我把你写的代码补全,并加上筛选和Table View绑定逻辑:
import Contacts import UIKit class YourContactViewController: UIViewController, UITableViewDataSource { @IBOutlet weak var contactsTableView: UITableView! // 存储重复的联系人组(每个元素是同一名字下的多个联系人) private var duplicateContactGroups: [[CNContact]] = [] private let contactStore = CNContactStore() override func viewDidLoad() { super.viewDidLoad() contactsTableView.dataSource = self contactsTableView.register(UITableViewCell.self, forCellReuseIdentifier: "DuplicateContactCell") } // 点击「显示重复联系人」按钮的触发方法 @IBAction func showDuplicatesButtonTapped(_ sender: UIButton) { fetchAndFilterDuplicateContacts() contactsTableView.reloadData() } private func fetchAndFilterDuplicateContacts() { // 检查并处理联系人访问权限 let authorizationStatus = CNContactStore.authorizationStatus(for: .contacts) switch authorizationStatus { case .notDetermined: contactStore.requestAccess(for: .contacts) { [weak self] granted, error in guard granted, let self = self else { return } DispatchQueue.main.async { self.fetchAndFilterDuplicateContacts() // 权限获取后重新执行查找 } } case .denied, .restricted: // 提示用户去设置开启权限 let alert = UIAlertController(title: "权限不足", message: "请在系统设置中开启联系人访问权限", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "知道了", style: .default)) present(alert, animated: true) case .authorized: // 权限已获取,开始查找联系人 let requiredKeys = [ CNContactIdentifierKey as CNKeyDescriptor, CNContactFormatter.descriptorForRequiredKeys(for: .fullName) ] let fetchRequest = CNContactFetchRequest(keysToFetch: requiredKeys) var contactsByName = [String: [CNContact]]() do { try contactStore.enumerateContacts(with: fetchRequest) { contact, stopPointer in // 获取联系人全名,跳过无法获取名字的联系人 guard let fullName = CNContactFormatter.string(from: contact, style: .fullName) else { return } // 将联系人按全名分组,默认创建空数组再追加 contactsByName[fullName, default: []].append(contact) } // 筛选出重复的联系人组(同一名字下有2个及以上联系人) duplicateContactGroups = contactsByName.values.filter { $0.count > 1 } } catch { print("获取联系人失败:\(error.localizedDescription)") } @unknown default: break } } // MARK: - UITableViewDataSource func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return duplicateContactGroups.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "DuplicateContactCell", for: indexPath) let contactsInGroup = duplicateContactGroups[indexPath.row] // 显示重复的联系人名称和重复数量 if let fullName = CNContactFormatter.string(from: contactsInGroup[0], style: .fullName) { cell.textLabel?.text = fullName cell.detailTextLabel?.text = "共 \(contactsInGroup.count) 个重复项" } return cell } }
关键逻辑说明
- 权限处理:先判断权限状态,未授权时请求权限,拒绝/受限则提示用户去系统设置开启
- 分组联系人:用字典
contactsByName把联系人按全名分组,同一个名字的联系人会被归类到同一个数组中 - 筛选重复项:通过
filter方法,只保留数组长度大于1的分组,这些就是存在重复的联系人组 - Table View展示:把筛选后的
duplicateContactGroups作为数据源,在Table View里显示每个重复组的名字和重复数量
如果想在点击Table View行时查看具体的重复联系人,可以添加didSelectRowAt方法,跳转到详情页面展示该组的所有联系人哦。
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

