введите описание изображения здесь Мне нужна опция, такая как сборщик изображений, для выбора контакта и отображения номера телефона. Мне удалось получить имена контактов, используя следующий код

С помощью этого кода он возвращает только имена, нужна опция, чтобы выбрать контакт из списка контактов

5
Midhun Narayan 20 Авг 2018 в 14:08

4 ответа

Лучший ответ

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

    }
}
16
Amal T S 19 Июн 2019 в 05:24
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) {

    }
}
4
Sujal 20 Авг 2018 в 11:59

Вы можете использовать это расширение, чтобы получить имя контакта.

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

Это класс для получения некоторых деталей EPContact

1
AshvinGudaliya 20 Авг 2018 в 11:21

Swift 5 и средство выбора контактов Получить электронную почту

Я хотел показать пример того, как вы можете сделать то же самое, что вы просили, но вместо этого для электронной почты и обновить для Swift 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.

0
Joseph Astrahan 26 Фев 2020 в 22:12
51929445