Обновление CNContact с помощью unifiedContactWithIdentifier: не позволяет редактировать возвращенный контакт после однократного редактирования записи контакта.

шаги, чтобы вызвать проблему - отредактируйте поле в CNContact, скажем, я редактирую электронную почту «email home». редактировать успешно работает

- (void)doUpdateField {
    NSString * tempString = [[[self contentView] phoneField] text];

    [self.navigationItem setRightBarButtonItem:self.loadingView];
    [self.activityView startAnimating];

    CNMutableContact * contactToUpdate = [self.incomingContact mutableCopy];
    NSMutableArray * arrEmails = [self.incomingArray mutableCopy];
    [arrEmails removeObjectAtIndex:self.incomingIndexPath.row];
    CNLabeledValue * label = self.incomingArray[self.incomingIndexPath.row];

    CNLabeledValue * emailValue = [CNLabeledValue labeledValueWithLabel:label.label value:tempString];

    [arrEmails addObject:emailValue];
    [contactToUpdate setEmailAddresses:arrEmails];

    NSError *error;
    CNSaveRequest *saveRequest = [[CNSaveRequest alloc] init];
    [saveRequest updateContact:contactToUpdate];

    BOOL success = [self.contactStore executeSaveRequest:saveRequest error:&error];
    if (success) {
        NSLog(@"success");
        [self.navigationItem setRightBarButtonItem:self.normalButton];
        [self.activityView stopAnimating];
    } else {
        NSLog(@"error %@", error);
        [self.navigationItem setRightBarButtonItem:self.normalButton];
        [self.activityView stopAnimating];
    }
}

-i затем обновите контакт таким образом, чтобы отобрать информацию

CNContact * refreshedContact = [self.contactStore unifiedContactWithIdentifier:self.incomingContact.identifier keysToFetch:keys error:&error];

Затем я пытаюсь отредактировать другое поле в обновленном контакте, но получаю следующую ошибку:

Error Domain=CNErrorDomain Code=2 "(null)" UserInfo={CNKeyPaths=(
    emailAddresses
)}

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


person Larry Pickles    schedule 03.10.2018    source источник


Ответы (1)


я только что понял это. Структура контактов — беспорядок. вместо того, чтобы звонить

CNLabeledValue * emailValue = [CNLabeledValue labeledValueWithLabel:label.label value:tempString];

вы должны назвать это

CNLabeledValue * emailValue = [label labeledValueBySettingValue:tempString];

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

person Larry Pickles    schedule 03.10.2018