Обновление 9/2/10: этот код больше не работает с обновлением iOS 4 - он не работает с внутренним утверждением. В настоящее время в справочной библиотеке iPhone SDK, которая называется "QuickContacts", доступен отличный API-адрес в адресной книге.
Код примера доступен здесь; это поможет вам решить эту проблему: http://developer.apple.com/iphone/library/samplecode/QuickContacts/Introduction/Intro.html
Я пытаюсь добавить функцию в свое приложение, которое позволяет пользователю выбирать контакт из ABPeoplePickerNavigationController, который затем отображает ABPersonViewController, соответствующий контакту, который они выбрал. В этот момент я хочу, чтобы пользователь имел возможность нажимать на номер контактного телефона и отвечать на свое поведение с помощью пользовательского поведения.
У меня есть ABPeoplePickerNavigationController, но я столкнулся с проблемой отображения ABPersonViewController. Я могу заставить ABPersonViewController анимировать на экране просто отлично, но он отображает только контактную фотографию, имя и название компании. Ни один из контактов других полей не отображается.
Я использую элемент "displayProperties" в ABPersonViewController, чтобы сообщить программе отображать номера телефонов. Это создает странное поведение; когда я выбираю контакт, у которого нет назначенных номеров, контакт отображается с "Нет телефонных номеров", записанным в фоновом режиме (как и следовало ожидать), но при выборе контакта, у которого есть номер телефона, все, что я получаю, пустую страницу контакта (без текста "Нет номеров телефонов" ).
Здесь метод в моем классе ABPeoplePikerNavigationController delegate, который я использую для создания класса 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];
Когда я опускаю эту строку, все, что я вижу, это пустой экран, когда я нажимаю контакт. ABPeoplePavlerNavigationController подталкивает PersonViewController к стеку NavigationController. Затем PersonViewController создает экземпляр объекта ABPersonViewController, но по какой-либо причине ABPersonViewController никогда не будет правильно добавлен в стек NavigationController.
Кто-нибудь знает, как добавить ABPersonViewController в стек, а не только PersonViewController?