iOS Swift CNContactPickerViewController 搜索联系人并添加到选择

Posted

技术标签:

【中文标题】iOS Swift CNContactPickerViewController 搜索联系人并添加到选择【英文标题】:iOS Swift CNContactPickerViewController search contact and add to selection 【发布时间】:2016-11-03 18:42:38 【问题描述】:

我正在使用 ios 9 和 Swift 2.2

我已经实现了 iOS 内置的 CNContactPickerViewController 使用 CNContactPickerDelegate 来获取联系号码,

CNContactPickerViewController 屏幕中,当我单击顶部的搜索字段并搜索姓名时,我需要将该姓名添加到我的选择中,但点击联系人后没有任何反应。

我到处搜索,并没有找到任何解决方案

我需要在我的代码中添加任何内容还是 iOS 9 错误

@IBAction func AddBtnKlkFnc(sender: AnyObject)

    let contactPicker = CNContactPickerViewController()
    contactPicker.delegate = self
    contactPicker.displayedPropertyKeys =
        [CNContactPhoneNumbersKey]
    self.presentViewController(contactPicker, animated: true, completion: nil)


func contactPicker(picker: CNContactPickerViewController, didSelectContacts ContctAryVar: [CNContact])

    for ContctVar in ContctAryVar
    
        let ContctDtlVar = ContctDtlCls()
        ContctDtlVar.ManNamVar = CNContactFormatter.stringFromContact(ContctVar, style: .FullName)!

        for ContctNumVar: CNLabeledValue in ContctVar.phoneNumbers
        
            var MobNumVar  = ((ContctNumVar.value as! CNPhoneNumber).valueForKey("digits") as? String)!
            if(MobNumVar.Len() > 10)
            
                MobNumVar = MobNumVar.GetLstSubSrgFnc(10)
            
            ContctDtlVar.MobNumVar = MobNumVar
            ContctDtlAryVar.append(ContctDtlVar)
        
    

【问题讨论】:

这是一个已知问题:请参阅openradar.me/25433471。 我只是想确认这在 iOS 10 中尚未修复。 Nop iOS 10.2 也没有修复 iOS 10.3.1 中仍未修复!!! 嗨,苏杰。你解决了那个问题吗?我也面临同样的问题。 【参考方案1】:

搜索结果似乎仅在单选模式下工作,因此请确保实施

func contactPicker(CNContactPickerViewController, didSelect: CNContact)

只有,但不是

func contactPicker(CNContactPickerViewController, didSelect: [CNContact])

如果您同时实现两者,则只接受一个 CNContact 作为参数的版本将被忽略,而是使用多选模式。

【讨论】:

太棒了!我想在此回复中添加 100 非常感谢@bbjay 这对我不起作用,委托方法 func contactPicker(CNContactPickerViewController, didSelect: CNContact) 在搜索后选择时永远不会被调用 @iOSMonster 您是否正确设置了您的委托?也许问一个新问题并显示您的代码【参考方案2】:
Use this updated code and  


   @IBAction func AddBtnKlkFnc(sender: AnyObject)
    
        let contactPicker = CNContactPickerViewController()
        contactPicker.delegate = self
        contactPicker.displayedPropertyKeys =
            [CNContactPhoneNumbersKey]
        self.presentViewController(contactPicker, animated: true, completion: nil)
    

    func contactPicker(picker: CNContactPickerViewController, didSelectContacts ContctAryVar: [CNContact])
    
        for ContctVar in ContctAryVar
        
            let ContctDtlVar = ContctDtlCls()
            ContctDtlVar.ManNamVar = CNContactFormatter.stringFromContact(ContctVar, style: .FullName)!

            for ContctNumVar: CNLabeledValue in ContctVar.phoneNumbers
            
                var MobNumVar  = ((ContctNumVar.value as! CNPhoneNumber).valueForKey("digits") as? String)!
                if(MobNumVar.Len() > 10)
                
                    MobNumVar = MobNumVar.GetLstSubSrgFnc(10)
                
                ContctDtlVar.MobNumVar = MobNumVar
                ContctDtlAryVar.append(ContctDtlVar)
            
        

     delegate.didFetchContacts([contact])
    navigationController?.popViewControllerAnimated(true)
    

【讨论】:

这里是代表。我得到这个“使用未解析的标识符'代表'”如何解决这个问题【参考方案3】:

这是 swift 4 版本

@IBAction func addPhoneContact(_ sender: UIButton) 
    let contactPicker = CNContactPickerViewController()
    contactPicker.delegate = self
    contactPicker.displayedPropertyKeys =
        [CNContactPhoneNumbersKey]
    self.present(contactPicker, animated: true, completion: nil)


extension ViewController: CNContactPickerDelegate 
  func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) 
      picker.dismiss(animated: true, completion: nil)
      let name = CNContactFormatter.string(from: contact, style: .fullName)
      for number in contact.phoneNumbers 
        let mobile = number.value.value(forKey: "digits") as? String
        if (mobile?.count)! > 7 
            // your code goes here
        
     
  

【讨论】:

【参考方案4】:

多选和搜索是互斥的。如果您希望搜索正常工作,则必须仅使用单选并仅实现单选委托方法。

【讨论】:

以上是关于iOS Swift CNContactPickerViewController 搜索联系人并添加到选择的主要内容,如果未能解决你的问题,请参考以下文章

CNContactPickerViewController 在 iOS Swift 中验证手机号码

ios 整理(一)swift和oc的区别

iOS-Swift-UIView

iOS开发中OC和swift的对比

ios OC、swift混编制作framework

iOS-swift-基础篇1