Сценарий состоит в том, что у меня есть несколько представлений, которые хотят вызвать адресную книгу. Чтобы не дублировать код делегата в каждом представлении, я поместил код в заголовок и файл .m делегата приложения, а использовал «@interface AddressBookDelegate» и «@implementation AddressBookDelegate» в нижней части 2 соответствующих приложений. Делегатский вечер -
@interface AddressBookDelegate : UIViewController <ABPeoplePickerNavigationControllerDelegate> {
AddressBookDelegate *addressBookDelegate;
}
@property (nonatomic, retain) AddressBookDelegate *addressBookDelegate;
@end
и
@implementation AddressBookDelegate
@synthesize addressBookDelegate;
- (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController *)peoplePicker
{
[self dismissModalViewControllerAnimated:YES];
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
[super dismissModalViewControllerAnimated:YES];
...get stuff from the Address Book...
return NO;
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
return NO;
}
Тогда, на мой взгляд, у меня есть следующий код:
addressBookDelegate = (AddressBookDelegate *) [[UIApplication sharedApplication] delegate];
ABPeoplePickerNavigationController *abPicker = [[ABPeoplePickerNavigationController alloc]init];
abPicker.peoplePickerDelegate = self.addressBookDelegate;
[self presentModalViewController:abPicker animated:YES];
[abPicker release];
Адресная книга хорошо отображается во всех видах. Но когда я предпринимаю какое-либо действие пользователя, которое вызовет делегата, например кнопку «Отмена» адресной книги, у меня происходит сбой -
- [MyprogAppDelegate peoplePickerNavigationControllerDidCancel:]: нераспознанный селектор, отправленный на экземпляр
Он компилируется чисто, без предупреждений.
Как мне подключить peoplePickerDelegate для подключения к коду делегата адреса, если он физически не находится в том же файле, что и само представление? Thx.
ДОБАВЛЕНО ПРИМЕЧАНИЕ: когда я использую отладчик и останавливаюсь на линии
abPicker.peoplePickerDelegate = addressBookDelegate;
в коде представления я вижу, что адрес addressBookDelegate указан как адрес MyprogAppDelegate, а не AddressBookDelegate, как я мог бы ожидать. Это заставляет меня думать, что смещение кода делегата адресной книги отключено в файле делегата приложения.
Если код делегата отмены AddressBookDelegate, скажем, 1000 байтов в AddressBookDelegate, мое приложение фактически «вводит» код 1000 байтов в MyprogAppDelegate, и поэтому происходит сбой. Так или иначе, я не настраиваю адресацию AddressBookDelegate правильно. В любом случае, это мое мнение ...