代码之家  ›  专栏  ›  技术社区  ›  Midhun Narayan

在ios中联系picker以获取电话号码

  •  2
  • Midhun Narayan  · 技术社区  · 6 年前

    enter image description here 我需要一个像图像选择器这样的选项来选择联系人和显示电话号码,我已经设法使用下面的代码获取联系人姓名

    通过使用此代码,它只返回姓名,需要一个选项从联系人列表中选择联系人

    3 回复  |  直到 6 年前
        1
  •  14
  •   Amal T S    5 年前

    进口 ContactsUI
    CNContactPickerDelegate

    import ContactsUI
    
    class YourViewController: CNContactPickerDelegate{
    
        //MARK:- contact picker
        func onClickPickContact(){
    
    
            let contactPicker = CNContactPickerViewController()
            contactPicker.delegate = self
            contactPicker.displayedPropertyKeys =
                [CNContactGivenNameKey
                    , CNContactPhoneNumbersKey]
            self.present(contactPicker, animated: true, completion: nil)
    
        }
    
        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
    
            print(primaryPhoneNumberStr)
    
        }
    
        func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
    
        }
    }
    
        2
  •  4
  •   Sujal    6 年前
    import ContactsUI
    
    private let contactPicker = CNContactPickerViewController()
    

    启动联系人选取器的按钮单击:

    @IBAction func accessContacts(_ sender: Any) {
        contactPicker.delegate = self
        self.present(contactPicker, animated: true, completion: nil)
    }
    

    实现委托方法

    extension YourViewController: CNContactPickerDelegate {
    
        func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
            let phoneNumberCount = contact.phoneNumbers.count
    
            guard phoneNumberCount > 0 else {
                dismiss(animated: true)
                //show pop up: "Selected contact does not have a number"
                return
            }
    
            if phoneNumberCount == 1 {
                setNumberFromContact(contactNumber: contact.phoneNumbers[0].value.stringValue)
    
            } else {
                let alertController = UIAlertController(title: "Select one of the numbers", message: nil, preferredStyle: .alert)
    
                for i in 0...phoneNumberCount-1 {
                    let phoneAction = UIAlertAction(title: contact.phoneNumbers[i].value.stringValue, style: .default, handler: {
                    alert -> Void in
                        self.setNumberFromContact(contactNumber: contact.phoneNumbers[i].value.stringValue)
                    })
                    alertController.addAction(phoneAction)
                }
                let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: {
                alert -> Void in
    
                })
                alertController.addAction(cancelAction)
    
                dismiss(animated: true)
                self.present(alertController, animated: true, completion: nil)
            }
        }
    
        func setNumberFromContact(contactNumber: String) {
    
            //UPDATE YOUR NUMBER SELECTION LOGIC AND PERFORM ACTION WITH THE SELECTED NUMBER
    
            var contactNumber = contactNumber.replacingOccurrences(of: "-", with: "")
            contactNumber = contactNumber.replacingOccurrences(of: "(", with: "")
            contactNumber = contactNumber.replacingOccurrences(of: ")", with: "")
            contactNumber = contactNumber.removeWhitespacesInBetween()
            guard contactNumber.count >= 10 else {
                dismiss(animated: true) {
                    self.popUpMessageError(value: 10, message: "Selected contact does not have a valid number")
                }
                return
            }
            textFieldNumber.text = String(contactNumber.suffix(10))
    
        }
    
        func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
    
        }
    }
    
        3
  •  1
  •   AshvinGudaliya    6 年前

    您可以使用此扩展名获取联系人姓名。

    extension CNContact {
        open func displayName() -> String {
            return givenName + " " + familyName
        }
    }
    

    这是课堂上的一些细节 EPContact

        4
  •  0
  •   Joseph Astrahan    5 年前

    斯威夫特5 &安培; 联系人选取器获取电子邮件

    首先确保导入 import ContactsUI

    然后确保你有一个出口到你的文本字段。

    @IBOutlet var emailTextField: UITextField!
    

    接下来,需要将联系人选择器设置为viewController的成员变量。这将保存稍后显示联系人选取器的信息。

    class EmailViewController: UIViewController {
        @IBOutlet var emailTextField: UITextField!
        private let contactPicker = CNContactPickerViewController()
    
        //... rest of view controller code, etc...
    }
    

    最后,您只需将此扩展添加到EmailViewController,代码如下:

    extension EmailViewController: CNContactPickerDelegate {
    
        func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
            let emailNumberCount = contact.emailAddresses.count
    
            //@JA - They have to have at least 1 email address
            guard emailNumberCount > 0 else {
                dismiss(animated: true)
                //show pop up: "Selected contact does not have a number"
                let alertController = UIAlertController(title: "No emails found for contact: "+contact.givenName+" "+contact.familyName, message: nil, preferredStyle: .alert)
                let cancelAction = UIAlertAction(title: "Ok", style: .default, handler: {
                alert -> Void in
    
                })
                alertController.addAction(cancelAction)
                self.present(alertController, animated: true, completion: nil)
                return
            }
    
            //@JA - If they have only 1 email it's easy.  If there is many emails we want to concatenate them and separate by commas , , ...
            if emailNumberCount == 1 {
                setEmailFromContact(contactEmail: contact.emailAddresses[0].value as String)
            } else {
                let alertController = UIAlertController(title: "Select an email from contact: "+contact.givenName+" "+contact.familyName+" or select 'All' to send to every email listed.", message: nil, preferredStyle: .alert)
    
                for i in 0...emailNumberCount-1 {
                    let emailAction = UIAlertAction(title: contact.emailAddresses[i].value as String, style: .default, handler: {
                    alert -> Void in
                        self.setEmailFromContact(contactEmail: contact.emailAddresses[i].value as String)
                    })
                    alertController.addAction(emailAction)
                }
    
                let allAction = UIAlertAction(title: "All", style: .destructive, handler: {
                alert -> Void in
                    var emailConcat = ""
                    for i in 0...emailNumberCount-1{
                        if(i != emailNumberCount-1){ //@JA - Only add the , if we are not on the last item of the array
                            emailConcat = emailConcat + (contact.emailAddresses[i].value as String)+","
                        }else{
                            emailConcat = emailConcat + (contact.emailAddresses[i].value as String)
                        }
                    }
                    self.setEmailFromContact(contactEmail: emailConcat)//@JA - Sends the concatenated version of the emails separated by commas
                })
                alertController.addAction(allAction)
    
                let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: {
                alert -> Void in
    
                })
                alertController.addAction(cancelAction)
    
                dismiss(animated: true)
                self.present(alertController, animated: true, completion: nil)
            }
        }
    
        func setEmailFromContact(contactEmail: String){
            emailTextField.text = contactEmail
        }
    
        func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
            print("contact picker canceled")
        }
    }
    

    例如,要在按钮的操作事件中调用选择器,可以执行以下操作:

    @IBAction func contactsButtonPressed(_ sender: UIButton) {
         contactPicker.delegate = self
         self.present(contactPicker, animated: true, completion: nil)
    }
    

    contactPicker.delegate = self 在我的例子中,viewController类(emailViewController)的扩展允许它访问 CNContactPickerDelegate 它需要的协议功能。