xcode 在ios中联系选择器以获取电话号码

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/51929445/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 10:44:37  来源:igfitidea点击:

Contact picker in ios to get phone number

iosswiftxcodecontactspicker

提问by Midhun Narayan

enter image description hereI need an option like image picker for picking contact and to display phone number i have managed to get contact names using below code

在此处输入图片说明我需要一个像图像选择器这样的选项来选择联系人并显示电话号码我已经设法使用下面的代码获取联系人姓名

by using this code it only returns the names , need an option to pick contact from contact list

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

回答by Midhun Narayan

import ContactsUI
and include - CNContactPickerDelegate

导入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) {

    }
}

回答by Sujal

import ContactsUI

private let contactPicker = CNContactPickerViewController()

Button click that initiates contact picker:

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

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

Implement delegate methods

实现委托方法

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) {

    }
}

回答by AshvinGudaliya

You can use this extension to get a contact name.

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

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

This is Class to get Some details EPContact

这是获取一些详细信息的类EPContact

回答by Joseph Astrahan

Swift 5& Contact Picker Get Email

Swift 5联系人选择器获取电子邮件

I wanted to show an example of how you can do the same thing you asked for but for email instead and updated for Swift 5 since some of the answers do not compile correctly above. This also has the added bonus of the 'all' option which will concatenate multiple emails into one string if the user selects it or not.

我想展示一个示例,说明如何执行您要求的相同操作,但使用电子邮件代替并针对 Swift 5 进行更新,因为上面的某些答案编译不正确。这也有“全部”选项的额外好处,如果用户选择它,它将把多封电子邮件连接成一个字符串。

First make sure to import import ContactsUI

首先确保导入 import ContactsUI

Then make sure you have an outlet to your textfield.

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

@IBOutlet var emailTextField: UITextField!

Next you need to set the contact picker as a member variable of your viewController. This will hold the information for showing the contact picker later.

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

class EmailViewController: UIViewController {
    @IBOutlet var emailTextField: UITextField!
    private let contactPicker = CNContactPickerViewController()

    //... rest of view controller code, etc...
}

Finally you can simply add this extension to the EmailViewController with the code below:

最后,您可以使用以下代码将此扩展程序添加到 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")
    }
}

To call up the picker in the action event of a button for example you could do this:

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

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

contactPicker.delegate = selfworks because of the extension on the viewController class (emailViewController) in my case that gives it access to the CNContactPickerDelegateprotocol functions it requires.

contactPicker.delegate = self在我的情况下,由于 viewController 类(emailViewController)的扩展,它可以访问CNContactPickerDelegate它所需的协议功能。