ABPersonViewController не сохраняет изменения - PullRequest
2 голосов
/ 30 июня 2011

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

После того, как контакты связаны, они отображаются, и пользователь может щелкнуть их, чтобы вызвать 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, содержащих идентификаторы записей.Вот мой код (где contactID - это массив идентификаторов записей, а ab - это ABAddressBookRef):

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

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

Ответы [ 3 ]

1 голос
/ 30 июня 2011

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

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

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

0 голосов
/ 30 июня 2011

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

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

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

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

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

Приветствия,

Thang

0 голосов
/ 30 июня 2011

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

...