Я борюсь с типами при добавлении данных к коду контактов IOS ниже, выдает ошибку

Я пытаюсь изменить контакт в своем приложении IOS, но получаю ошибку типа Значение типа «[CNContact]» не имеет члена «familyName»

    let updateContact = try contactStore.unifiedContacts(matching: predicate,keysToFetch: toFetch as [CNKeyDescriptor])
            updateContact.familyName.append(CNLabeledValue(label: CNLabelWork, value: contact["2"]!))

Очевидно, у меня неправильный тип для updateContact, но я не могу понять, где я ошибся


person Jeremy    schedule 21.03.2017    source источник
comment
может быть у вашего текущего контакта нет фамилии   -  person Anbu.Karthik    schedule 21.03.2017


Ответы (1)


Свойства, которые вы хотите получить для объектов CNContacts, возвращаемых вызовом unifiedContacts, указаны в массиве toFetch. Вы указали значение familyName как часть массива toFetch?

Если вы не уверены, укажите код, который вы использовали для настройки массива toFetch.

Обновление. Вызов unifiedContacts возвращает массив из CNContact объектов. Вот почему вы получили ошибку. Вам нужно будет получить экземпляр CNContact из массива, а затем изменить его. Что-то вроде этого:

if let updateContact = try contactStore.unifiedContacts(matching: predicate,keysToFetch: toFetch as [CNKeyDescriptor]).first {
    let name = updateContact.familyName + contact["2"]!
    updateContact.setValue(name, forKey:CNContactFamilyNameKey)
}
person Fahim    schedule 21.03.2017
comment
let predicate = CNContact.predicateForContacts(matchingName: delCont) let toFetch = [CNContactGivenNameKey] + [CNContactFamilyNameKey] - person Jeremy; 21.03.2017
comment
@Jeremy Если вы можете предоставить полный проект, я могу отладить его, чтобы было легче увидеть, что происходит :) - person Fahim; 21.03.2017
comment
Хорошо, я пропустил это в первый раз — вызов unifiedContacts возвращает массив из CNContact объектов. Вот почему вы получили ошибку. Вам нужно будет получить экземпляр CNContact из массива, а затем изменить его. - person Fahim; 21.03.2017
comment
+1 Ответ в обновлении: unifiedContacts возвращает массив контактов (на самом деле очевидно, если подумать) - person JeremyP; 21.03.2017
comment
Не могли бы вы отметить это как правильное, если код, который я предоставил, работает для вас? - person Fahim; 21.03.2017
comment
Фахим Моя проблема по-прежнему заключается в том, как обновить другие элементы, такие как номера телефонов организации, адрес электронной почты, т.е. перезаписать существующие значения, а не добавлять новую запись\ - person Jeremy; 21.03.2017
comment
@Jeremy Вы видели мой код выше, где обновляется значение Family Name? Таким же образом вы устанавливаете значения и для других свойств объекта CNContact. В основном, следующее - updateContact.setValue(name, forKey:CNContactFamilyNameKey) - person Fahim; 21.03.2017
comment
Еще раз спасибо - я видел код, и он отлично работает для имен, но моя проблема заключается в понимании обновления элементов, таких как номер телефона электронной почты, то есть тех, которые имеют несколько значений. Мы оставим это на некоторое время, а затем попробуем еще раз - person Jeremy; 21.03.2017
comment
@Jeremy Номера телефонов, URL-адреса, адреса электронной почты и т. Д. Поступают в виде массивов для объекта CNContact. Итак, если вы знаете значение, которое хотите заменить, вам придется пройтись по массиву, найти объект с нужным значением, а затем установить новое значение для этого объекта. Если вы не знаете точное значение, но у вас есть новый список значений, вы просто замените старый список новым списком или создадите комбинированный список обоих наборов значений — в зависимости от того, что вы хотите. - person Fahim; 22.03.2017