Выбрать несколько свойств из одного контакта в CNContactPicker
Я пытаюсь использовать 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 ответ
tl; dr - нет, вы не можете использовать CNContactPickerViewController
выбрать несколько свойств из одного контакта.
Полная версия:
CNContactPickerViewController
плохо и запутанно реализовано.
Фактически, он не поддерживает возможность выбора нескольких свойств из одного контакта. Средство выбора автоматически отклоняется после выбора одного свойства контакта.
Это фактически не позволяет пользователю выбирать определенные свойства из нескольких контактов.
Он поддерживает следующее:
- Выберите один контакт
- Выберите одно свойство одного контакта
- Выберите несколько контактов
- Выберите несколько контактов и верните одно предопределенное (не выбранное пользователем) свойство для каждого из выбранных пользователем нескольких контактов.
Чтобы получить didSelectContactProperties
Для вызова делегата с чем-либо, кроме пустого списка свойств, вы должны установить predicateForSelectionOfProperty
свойство предиката, которое указывает один и только один ключ свойства контакта. Если вы предоставите какой-либо другой предикат, вы получите черный экран, когда вы нажмете на контакт, и ваше приложение теперь зависло и его нужно убить.
Я считаю, что есть несколько ошибок, связанных с выбором свойств контактов из нескольких контактов.
Временное решение:
Я полагаю, что единственное решение (помимо ваших собственных законченных пользовательских контроллеров представления в структуре контактов) было бы сделать свой собственный выбор нескольких свойств путем объединения CNContactPickerViewController
в режиме выбора одного контакта с последующим использованием CNContactViewController
для отображения сведений о выбранном контакте. Затем реализовать contactViewController(_:shouldPerformDefaultActionFor:)
Метод делегата для отслеживания свойств, выбранных пользователем.