Обновление 9/2/10: этот код больше не работает с обновлением iOS 4 - он не работает с внутренним утверждением. Теперь в справочной библиотеке iPhone SDK есть отличный пример API адресной книги под названием «QuickContacts».
Пример кода доступен здесь; это поможет вам решить эту проблему:
http://developer.apple.com/iphone/library/samplecode/QuickContacts/Introduction/Intro.html
Я пытаюсь добавить в свое приложение функцию, позволяющую пользователю выбрать контакт из ABPeoplePickerNavigationController , который затем отображает ABPersonViewController , соответствующий выбранному контакту. В этот момент я хочу, чтобы пользователь мог щелкнуть телефонный номер контакта, и чтобы мое приложение отвечало по своему усмотрению.
У меня ABPeoplePickerNavigationController работает нормально, но я столкнулся с проблемой при отображении ABPersonViewController . Я могу заставить ABPersonViewController анимировать на экране просто отлично, но он отображает только фотографию контакта, имя и название компании. Ни одно из других полей контакта не отображается.
Я использую элемент displayProperties в ABPersonViewController , чтобы сообщить программе об отображении телефонных номеров. Это создает какое-то странное поведение; когда я выбираю контакт, которому не назначены телефонные номера, контакт отображается с надписью «Нет телефонных номеров» в фоновом режиме (как и следовало ожидать), но при выборе контакта, у которого есть телефонный номер, все, что я получаю, это пустая страница контактов (без текста «Нет телефонных номеров»).
Вот метод в моем ABPeoplePickerNavigationController делегате классе, который я использую для создания моего PersonViewController класса, который реализует интерфейс ABPersonViewController:
- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
BOOL returnState = NO;
PersonViewController *personView = [[PersonViewController alloc] init];
[personView displayContactInfo:person];
[peoplePicker pushViewController:personView animated:YES];
[personView release];
return returnState;
}
Вот мой PersonViewController.h заголовочный файл:
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <AddressBookUI/AddressBookUI.h>
@interface PersonViewController : UIViewController <ABPersonViewControllerDelegate>
{
}
- (void) displayContactInfo: (ABRecordRef)person;
@end
Наконец, вот мой PersonViewController.m , который создает ABPersonViewController для просмотра выбранного контакта:
#import "PersonViewController.h"
@implementation PersonViewController
- (void) displayContactInfo: (ABRecordRef)person
{
ABPersonViewController *personController = [[ABPersonViewController alloc] init];
personController.personViewDelegate = self;
personController.allowsEditing = NO;
personController.displayedPerson = person;
personController.addressBook = ABAddressBookCreate();
personController.displayedProperties = [NSArray arrayWithObjects:
[NSNumber numberWithInt:kABPersonPhoneProperty],
nil];
[self setView:personController.view];
[[self navigationController] pushViewController:personController animated:YES];
[personController release];
}
- (BOOL) personViewController:(ABPersonViewController*)personView shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue
{
return YES;
}
@end
Кто-нибудь имеет какое-либо представление о том, почему я вижу этот пустой экран "Контакт" вместо экрана с интерактивными полями номера телефона?
Хорошо, я думаю, что все ближе к поиску проблемы. Я уверен, что именно с этой частью вызова displayContactInfo выше:
[self setView:personController.view];
Когда я пропускаю эту строку, все, что я вижу, это пустой экран, когда я щелкаю контакт. ABPeoplePickerNavigationController помещает PersonViewController в стек NavigationController. Затем PersonViewController создает экземпляр объекта ABPersonViewController, но по какой-либо причине ABPersonViewController никогда не добавляется должным образом в стек NavigationController.
Кто-нибудь знает, как добавить ABPersonViewController в стек, а не просто PersonViewController?