Множественный выбор из ContactUI в Swift 3

Я очень новичок в кодировании на Swift и пытаюсь научить себя. У меня возникли проблемы с выяснением того, как включить множественный выбор из пользовательского интерфейса ContactPicker View в Swift 3.

Из чтения документации кажется, что для включения множественного выбора я должен использовать [CNContactProperty], но это неоднозначно. Когда я делаю это, я не могу вызвать свойство для печати данного имени и значения, потому что они не являются членами массива. Также, когда я использую синтаксис [CNContactProperty], в моем представлении выбора не отображается кнопка «Готово» для завершения выбора. Отмена — мой единственный способ выйти из режима выбора.

Я нашел много ответов для предыдущих версий Swift, но меня интересует, как использовать эту функцию в Swift 3. В конечном итоге я пытаюсь предварительно заполнить поле контактов в UIMessageComposer, чтобы отправить сообщение нескольким контактам из массива одним нажатием кнопки отправки.

// this is the code that works for a single selection
import UIKit
import ContactsUI
import Contacts

class MainViewController: UIViewController, CNContactPickerDelegate {

// select Contacts to message from "Set Up" Page
@IBAction func pickContacts(_ sender: Any) {

    let contactPicker = CNContactPickerViewController()

    contactPicker.delegate = self
    contactPicker.displayedPropertyKeys = [CNContactPhoneNumbersKey]

    self.present(contactPicker, animated: true, completion: nil)

}

//allow contact selection and dismiss pickerView
func contactPicker(_ picker: CNContactPickerViewController, didSelect contactsProperty: CNContactProperty) {
    let contact = contactsProperty.contact
    let phoneNumber = contactsProperty.value as! CNPhoneNumber

    print(contact.givenName)
    print(phoneNumber.stringValue)

}

person FatyP33    schedule 08.04.2017    source источник


Ответы (1)


В вашей реализации CNContactPickerDelegate вы реализовали:

contactPicker(_ picker: CNContactPickerViewController, didSelect contactsProperty: CNContactProperty) 

Который вызывается при выборе определенного свойства. Но если вы хотите выбрать несколько контактов, вам необходимо реализовать:

contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact])

Это возвращает массив выбранных контактов. Таким образом, ваш метод реализации делегата может выглядеть примерно так:

func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]) {
    for contact in contacts {
        let phoneNumber = contact.value(forKey:CNContactPhoneNumbersKey)
        print(contact.givenName)
        print(phoneNumber)
    }
}

Конечно, переменная phoneNumber будет включать в себя массив телефонных номеров, и вам нужно будет пройтись по массиву, чтобы получить определенный номер.

person Fahim    schedule 08.04.2017
comment
Спасибо, сэр, вы спасаете жизнь. Команда print (phoneNumber) по-прежнему давала мне длинную строку, поэтому я внес небольшое изменение. Все еще не могу отблагодарить вас достаточно. //изменение, которое я сделал, чтобы получить номер телефона в виде короткой строки//// let phoneNumber = (contact.phoneNumbers[0].value).value(forKey: digits)! - person FatyP33; 08.04.2017
comment
Рад помочь :) Если приведенный выше ответ помог, не забудьте проголосовать и отметить его как правильный. - person Fahim; 08.04.2017