выбрать несколько свойств из одного контакта в CNContactPicker - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь использовать CNContactPickerViewController и продолжаю сталкиваться с проблемами с тем, как выбрать несколько свойств из одного контакта

Базовое отображение сборщика

    let contactStore = CNContactStore()

override func viewDidLoad() {
    super.viewDidLoad()

    self.askForContactAccess()
    self.displayContacts()
}

func displayContacts(){
    let contactPicker = CNContactPickerViewController()
    contactPicker.delegate = self
    self.present(contactPicker, animated: true, completion: nil)
}

это отображает адресную книгу после того, как пользователь дал разрешение (код есть, но не показывал его выше)

Теперь я хотел бы, чтобы пользователь выбирал контакт, который мы переходим в представление сведений о контакте (это происходит в настоящее время), но когда я пытаюсь использовать делегата

func contactPicker(_ picker: CNContactPickerViewController, didSelectContactProperties contactProperties: [CNContactProperty])

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

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

1 Ответ

0 голосов
/ 11 мая 2018

tl; dr - Нет, вы не можете использовать CNContactPickerViewController для выбора нескольких свойств из одного контакта.

Полная версия:

CNContactPickerViewController плохо и запутанно реализован.

На самом деле он фактически не поддерживает возможность выбора нескольких свойств из одного контакта.Средство выбора автоматически отклоняется после выбора одного свойства контакта.

Фактически оно не позволяет пользователю выбирать определенные свойства из нескольких контактов.

Поддерживается следующее:

  • Выбор одного контакта
  • Выбор одного свойства одного контакта
  • Выбор нескольких контактов
  • Выбор нескольких контактов и возврат одного заранее определенного (не выбранного пользователем) свойства изкаждый пользователь выбрал несколько контактов.

Чтобы делегат didSelectContactProperties вызывался с чем-либо, кроме пустого списка свойств, необходимо установить для свойства predicateForSelectionOfProperty предикат, который указываетодин и только один контактный ключ свойства.Если вы предоставите любой другой предикат, вы получите черный экран, когда вы нажмете на контакт, и ваше приложение теперь зависло и его необходимо уничтожить.

Я полагаю, что при выборе свойств контактов для нескольких контактов есть несколько ошибок..

Обходной путь:

Я полагаю, что единственное решение (помимо ваших собственных полных пользовательских контроллеров представления вокруг структуры контактов) было бы сделать свой собственный выбор нескольких свойств путем объединенияCNContactPickerViewController в режиме выбора одного контакта с последующим использованием CNContactViewController для отображения сведений о выбранном контакте.Затем реализуйте метод делегата contactViewController(_:shouldPerformDefaultActionFor:), чтобы отслеживать свойства, выбранные пользователем.

...