2016-03-08 3 views
0

Я пытался манипулировать контактами через новую фреймворк Контакты и КонтактыUI на IOS9. Мне нужно выяснить точные различия после того, как конечный пользователь изменит свою информацию, такую ​​как номера телефонов или электронные письма, то есть узнайте, что сделал конечный пользователь в своей адресной книге для указанного контакта.IOS9 как найти различия между двумя CNContact?

Это легче, если контакт имеет разную метку для каждого элемента (телефоны/электронные письма). Тем не менее, я не знаю, как извлечь различия, если есть та же метка для телефонов или электронной почты, например:

Джон: телефон: дома: 123-456 офис: 223-456 офис: 456- 334 электронная почта: электронная почта: [email protected] электронная почта: [email protected]

после измененная, новая информация может быть: Джон: телефон: дома: 123-456 офис: 223- 889 (изменено) офис: 456-377 (изменить позицию) электронная почта: электронная почта: [email protected] (изменен пункт) адрес электронной почты: [email protected] (изменен пункт)

С ContactsUI, я могу захватить два контактных объектов до изменения и после изменения.

Вопрос в том, как найти изменения?

Заранее спасибо.

+0

Пройдите через объекты недвижимости и сравните их. – ogres

ответ

0

Предположим, вы знаете, как итерации через массив новых phoneNumbers и emails и старые. Вы можете сравнить пары значений метки & между старым и новым контактным объектом и определить, существовала ли новая пара.

Некоторого неопробованный код:

func findOutContactDifference() { 
    // Assume you already have the two contact objects 
    let oldContact : CNContact = ... 
    let newContact : CNContact = ... 

    // Get list of phoneNumbers out 
    let oldPhoneNumbers = oldContact.phoneNumbers 
    let newPhoneNumbers = newContact.phoneNumbers 

    // Iterate through the new phoneNumbers array 
    for aNewPhoneNumber in newPhoneNumbers { // Type of aNewPhoneNumber will be CNLabeledValue 
    let newPhoneLabel = aNewPhoneNumber.label // This will be a string 
    let newPhoneNumber = aNewPhoneNumber.value as! CNPhoneNumber // You have to cast as specified in the document 

    let thisPhoneNumberAlreadyExisted = phoneNumberExisted(newPhoneLabel, newNumber : newPhoneNumber, oldPhoneNumbers : oldPhoneNumbers) 
    if (!thisPhoneNumberAlreadyExisted) { 
     // This is a new phone number!! 
     let brandNewNumber = newPhoneNumber 
    } 
    } 

    // Do the similar thing for email 
    // Beaware that cast for email.value will just be String 
    // ... 
} 

/// Will return whether the input pair already existed in the old list 
func phoneNumberExisted(newLabel : String, newNumber : CNPhoneNumber, oldPhoneNumbers : [CNLabeledValue]) -> Bool { 
    for anOldPhoneNumber in oldPhoneNumbers { 
    let oldLabel = anOldPhoneNumber.label 
    let oldNumber = anOldPhoneNumber.value as! CNPhoneNumber 

    if oldLabel == newLabel && oldNumber == newLabel { 
     return true // Found a matched pair 
    } 
    } 
    return false // Nothing matched 
} 

==========

Справочник по CNLabeledValuevalue собственности

значение контакта свойства, такие как CNPhoneNumber при а номер телефона, NSString для адреса электронной почты и т. д. Для допустимых значений см. Свойства CNContact, которые являются массивами объектов с мечеными значениями.

EDIT

Ссылка для CNLabeledValueidentifier собственности

Рекомендуется использовать идентификатор при поиске ранее известный объект маркировано значения в повторном неправдоподобно контакте. Идентификатор может быть сохранен между запуска приложений.

+0

Привет, zcui93, Спасибо за ваш ответ, но в некоторых случаях метки всегда одинаковы, например, контакты, которые импортируются из учетной записи outlook.com. Таким образом, пары меток + число не могут работать хорошо. –

+0

Сравнение всех комбинаций гарантирует, что вы не пропустите ни одного соответствия. Причина, по которой мы используем пару, заключается в том, что ярлык сам по себе не работает. Вы можете привести примеры, которые, по вашему мнению, не сработают. В примере, приведенном в вопросе, «home: 123-456» будет обозначен как неизменный, и все остальные будут идентифицированы как измененные. – zcui93

+0

Вы правы, с кодом вы можете найти измененные предметы. Но для получения дополнительной информации, например, если мне нужно отслеживать изменение, из которого число изменилось на другой номер, гораздо труднее заставить его вызвать дублированные метки. Я прав? –

Смежные вопросы