You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击显示按钮时如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:18:48