ABPersonViewController Не Сохраняет Изменения


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

Как только контакты связаны, они отображаются, и пользователь может щелкнуть по ним, чтобы вызвать ABPersonViewController. Редактирование, по-видимому, работает, но когда представление пользователя закрыто, изменения не сохраняются.

Вот соответствующий код:

ABPersonViewController *personController = [[ABPersonViewController alloc] init];
personController.personViewDelegate = self;
personController.allowsEditing = YES;
personController.displayedPerson

[self.navigationController pushViewController:personController animated:YES];

[personController release];

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

Я попытался создать свойство ABAddressBookRef и присвоить его контроллеру с помощью

personController.addressBook = ab;

И затем сохранение адресной книги, но это тоже не сработало.

Редактировать:

Я уже реализую <ABPersonViewControllerDelegate>. Он имеет только один метод, и если я правильно помню, неспособность реализовать это помешает ABPersonViewController работать вообще.

Вот мой полный реализация:

- (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
    return YES;
}
Насколько мне известно, это просто означает, что контроллер будет вести себя нормально.

Править 2:

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

Я храню контакты в виде массива NSNumbers, содержащего идентификаторы записей. Вот мой код (где contactIDs-это массив ID записей, а ab-это ABAddressBookRef):

NSMutableArray *contactArray = [NSMutableArray array];
for (NSNumber *contactNumber in contactIDs) {
    NSInteger contactID = [contactNumber intValue];
    [contactArray addObject:ABAddressBookGetPersonWithRecordID(ab, contactID)];
}

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

3 2

3 ответа:

У меня получилось. Проблема заключалась в том, что я использовал два разных ABAddressBookRefs.

Я создал массив Abrecordref (как видно из моего отредактированного вопроса), используя один ABAddressBookRef, но когда я прочитал ABRecordRef из массива, ABAddressBookRef, который я использовал, уже был выпущен.

Я сделал экземпляр ABAddressBookRef сохраняемым на протяжении всего жизненного цикла экземпляра моего класса, и это сработало.

Для решения этой проблемы необходимо задать метод делегирования всех адресных книг. Перейти по этой ссылке

Как вы создали адресную книгу? Вы использовали ABAddressBookCreate()?

Кроме того, вы должны убедиться, что вы реализуете ABPersonViewControllerDelegate Правильно.

Пожалуйста, проверьте этот пример http://developer.apple.com/library/ios/#samplecode/QuickContacts/Introduction/Intro.html

Я верю, что она состоит все, что вам нужно!

Обновление вы должны попробовать ABAddressBookSave метод!

Ура,

Тханг