【问题标题】:Getting people name and number from mobile contact in IOS从IOS中的移动联系人获取人员姓名和号码
【发布时间】:2017-02-21 13:45:03
【问题描述】:

我希望在我的应用程序https://www.youtube.com/watch?v=HKCXwm7r838 中使用这个过程。但是本教程中的代码是针对旧版 IOS 的,我使用的是 IOS 10、Xcode 8.2、Swift 3.0,所以它不适合我。我尝试了以下代码来显示联系人列表。它有效。

import UIKit
import ContactsUI
class ViewController: UIViewController, CNContactPickerDelegate{

    @IBOutlet weak var textLabel: UILabel!
    override func viewDidLoad()
    {
        super.viewDidLoad()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }
    func addExistingContact()
    {

    }
    func contactPicker(picker: CNContactPickerViewController, didSelectContact contacts: CNContact)
    {
       // print(contacts.givenName)

    }

    @IBAction func button(_ sender: Any)
    {
        let contactPicker = CNContactPickerViewController()
        contactPicker.delegate = self
        contactPicker.displayedPropertyKeys =
            [CNContactGivenNameKey
                , CNContactPhoneNumbersKey]
        self.present(contactPicker, animated: true, completion: nil)
    }

    func contactPickerDidCancel(picker: CNContactPickerViewController)
    {
        print("Cancel Contact Picker")
    }
}

现在,我想要的是,当我从列表中选择任何联系人姓名时,联系人列表必须立即消失,然后选择的姓名和号码必须显示在 viewController 中的两个标签/文本字段中。有人可以告诉我应该使用什么代码吗?提前致谢。

【问题讨论】:

    标签: ios swift contacts


    【解决方案1】:

    替换方法 contactPicker(picker: CNContactPickerViewController, didSelectContact contacts: CNContact)contactPickerDidCancel(picker: CNContactPickerViewController)
    func contactPicker(_ picker: CNContactPickerViewController, 
                  didSelect contactProperty: CNContactProperty) {
    
    }
    
    func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
         // You can fetch selected name and number in the following way
    
        // user name
        let userName:String = contact.givenName 
    
        // user phone number
        let userPhoneNumbers:[CNLabeledValue<CNPhoneNumber>] = contact.phoneNumbers        
        let firstPhoneNumber:CNPhoneNumber = userPhoneNumbers[0].value 
    
        // user phone number string
        let primaryPhoneNumberStr:String = firstPhoneNumber.stringValue 
    }
    
    func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
    
    }
    

    鉴于您的要求是在点击联系人后立即关闭 ContactPicker,您不应实现以下方法。 从您的代码中删除以下给定的方法

    func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]) {
    
    }
    
    func contactPicker(_ picker: CNContactPickerViewController, didSelectContactProperties contactProperties: [CNContactProperty]) {
    
    }
    

    【讨论】:

    • 你能告诉我,当我点击任何联系人姓名时,我应该在这些方法中使用什么代码来立即关闭联系人列表。并且必须打印所选的名称和号码。
    • @Tester,我相信我当前编辑的答案可以解决问题。如果我遗漏了什么,请告诉我
    【解决方案2】:

    我会告诉你如何获取你的联系人列表。你的帖子的最后一部分(列表的东西)你必须自己做,因为它只是在玩 TableView 控制器。 第一次导入:

    import Contacts
    

    例如,我使用它来获取我的所有联系人:

       let store = CNContactStore()
            var contacts = [CNContact]()
            let keys = [CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactSocialProfilesKey] as [Any]
            let request = CNContactFetchRequest(keysToFetch: keys as! [CNKeyDescriptor])
    
    
            do{
                try store.enumerateContacts(with: request){
                    (contact, stop) in
                      contacts.append(contact)
                }
    
                guard contacts.count > 0 else{
                    //Show contact list
                    return
                }
            } catch let err{
                print(err)
            }
    

    另外,在您的代码中的某个地方,您需要请求联系权限:

    switch CNContactStore.authorizationStatus(for: .contacts){
                            case .authorized:
                                 //
                            case .notDetermined:
                                store.requestAccess(for: .contacts){succeeded, err in
                                    guard err == nil && succeeded else{
                                        return
                                    }
                                }
                            case .denied:
                                //
                            case .restricted:
                                //
                            default:
                                print("Not handled")
                        }
    

    重要提示:添加您的 info.plist:

    Privacy - Contacts Usage Description
    

    【讨论】:

    • 我得到了我的联系人列表,伙计,使用帖子中的代码。我只想选择一个联系人姓名。并且必须打印所选的联系人姓名和号码,同时联系人列表必须消失。
    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多