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


person Prasanth    schedule 11.05.2018    source источник
comment
Я думаю, вам нужно заполнить CNContactPickerViewController#displayedPropertyKeys свойствами, которые вы хотите отображаться до того, как средство выбора отобразит лист свойств для определенного контакта   -  person MadProgrammer    schedule 11.05.2018
comment
Спасибо MadProgrammer - я не уверен насчет ключей свойств, так как я действительно хочу, чтобы он отображал все свойства в контакте. Прямо сейчас, когда я не добавляю функцию делегата, она отображает всю карту сведений. Я просто ничего не могу с ней поделать.   -  person Prasanth    schedule 11.05.2018


Ответы (1)


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

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

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

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

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

Он поддерживает следующее:

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

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

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

Временное решение:

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

person rmaddy    schedule 11.05.2018
comment
Спасибо, Мадди, за очень подробное объяснение. Я согласен, похоже, что сборщик плохо реализован. Я обнаружил, что, реализовав contactPicker.predicateForSelectionOfContact = NSPredicate(value: false), а затем используя func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty), я мог бы, по крайней мере, щелкнуть несколько свойств и добавить их в свой массив свойств, но я не вижу способа сохранить выделение/установить флажок рядом с каждым из свойств. свойства, так как у меня нет возможности получить доступ к подробному контроллеру представления - person Prasanth; 11.05.2018
comment
Мэдди с точки зрения вашего обходного пути ... даже если я держу его в режиме выбора одного контакта, когда я нажимаю на контакт, он либо немедленно отклоняет представление (если predicateForSelectionOfContact = NSPredicate(value: true), либо переводит меня в подробное представление, если для предиката установлено значение false. Вы знаете чистый способ отображения cncontactviewcontroller? - person Prasanth; 11.05.2018
comment
На самом деле я не пробовал предложенный мной возможный обходной путь. Но я предполагаю, что вам придется отображать CNContactViewController после того, как CNContactPickerViewController будет отклонено. - person rmaddy; 11.05.2018