2011-12-02 1 views
0

Сценарий состоит в том, что у меня есть несколько видов, которые хотят вызвать адресную книгу. Чтобы не дублировать код делегата в каждом представлении, я нашел код в заголовке Append и файле .m, но с помощью «@interface AddressBookDelegate» и «@implementation AddressBookDelegate» в нижней части 2-х соответствующих приложений Делегат fiies-Почему людиPickerDelegate не получают адрес делегата?

@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]; 

Адресная книга отображает отлично во всех видах. Но когда я принимать какие-либо действия пользователя, который будет ссылаться делегат, как адрес кнопку Отмена книги, я crash-

- [MyprogAppDelegate peoplePickerNavigationControllerDidCancel]: непризнанные селектор направлен например

Он компилирует чистый , никаких предупреждений.

Как подключить peoplePickerDelegate для соединения с кодом делегирования адресов, когда он физически не находится в том же файле, что и само представление? Спасибо.

ADDED Примечание: при использовании отладчика и остановки на линии

abPicker.peoplePickerDelegate = addressBookDelegate; 

в коде представления, я вижу, что адрес для addressBookDelegate, как утверждается, адрес MyprogAppDelegate, не AddressBookDelegate, как Я мог бы ожидать. Это заставляет меня думать, что смещение в код делегата адресной книги отключено в файле делегата приложения.

Если адрес AddressBookDelegate Cancel Делегат сказал 1000 байтов в AddressBookDelegate, мое приложение фактически «вводит» код 1000 байтов в MyprogAppDelegate и поэтому выходит из строя. Поэтому я как-то неправильно настраиваю адресацию AddressBookDelegate. Это мой взгляд на него в любом случае ...

ответ

0

В конце концов, я не был в состоянии сделать какие-либо из вышеперечисленных предложений работать как надеялись. Мне пришлось сократить время и двигаться дальше, поэтому я продублировал код в каждом представлении. Я передумаю это в другой раз, так как я уверен, что это можно сделать на более объектной основе, чем я закончил это делать.

1

Ваш код предполагает, что ваш AppDelegate (MyprogAppDelegate) реализует метод peoplePickerNavigationControllerDidCancel.

Итак, ваш код в MyprogAppDelegate должно быть что-то вроде этого:

@implementation MyprogAppDelegate 
@synthesize ...; 

#pragma mark - 
#pragma mark Application lifecycle 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  


    return YES; 
} 

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker{ 

} 
+0

У меня есть это, извините, я предполагал, что это было очевидно. Я добавил его к вопросу. Таким образом, код делегата сборщика людей находится в App Delegate IS там. В моем обращении к этому есть что-то нехорошее, связанное с ним. Обратите внимание на добавленный текст в нижней части вопроса, если это прояснит что-либо. – Ric

0

EDIT Хорошо, весь первый ответ был выброшен. Это, с некоторым предупреждением, все еще немного выстрелит в темноте, но я думаю, что это будет ближе к полезности. Однако некоторые из этих идей несут ответственность.

  1. Вы очень вероятно не нужен отдельный класс, чтобы действовать в качестве ABPeoplePickerNavigationControllerDelegate. По всей вероятности, он должен быть тем же классом, который имеет ваш код внизу (который вызывает presentModalViewController:animated:. Поскольку я не знаю, какой контроллер был, я просто позвоню ему MyViewController. диспетчер представлений должен быть делегатом, потому что в ваших методах делегирования вам необходимо убрать диспетчер модального представления, который имеет адресную книгу.

  2. You определенно не хотите вашей программы UIApplicationDelegate быть ABPeoplePickerNavigationControllerDelegate. Как вы сами сказали, peoplePickerDelegate должен быть UIViewController.

Итак, до MyViewController. Во-первых, интерфейс:

/* MyViewController.h */ 

@interface MyViewController : UIViewController<ABPeoplePickerNavigationControllerDelegate> 
... 
@end 

Ваш контроллер может наследовать от потомка UIViewController (например, контроллер табличного или что-то в этом роде) - что не изменится, то единственное, что нужно изменить в добавление к ABPeoplePickerNavigationControllerDelegate список реализованных протоколов.

Теперь, чтобы реализовать функциональные возможности:

/* MyViewController.m */ 

@implementation MyViewController 

... 
- (void) whateverMethodIsDisplayingTheAddressBook 
{ 
    ABPeoplePickerNavigationController *abPicker = [[ABPeoplePickerNavigationController alloc]init];  
    abPicker.peoplePickerDelegate = self; // This view controller is the delegate 
    [self presentModalViewController:abPicker animated:YES]; 
    [abPicker release]; 
} 

... 

- (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; 
} 

@end 
+0

Я откладывал ответ, потому что я пытаюсь реализовать концепцию, которую вы показываете. Я понимаю большую картину, но, когда я ставил код, что, на ваш взгляд, я имею в виду, я перехожу от чистого компиляции до 10 ошибок. Затем я попытался интегрировать AddressBookDelegate в MyprogAppDelegate только для того, чтобы подойти к стене, чтобы MyprogAppDelegate был получен из NSObject, а метод rejectModalViewControllerAnimated должен быть получен из объекта UIViewController. Я снова возвращаюсь к вашей структуре, чтобы узнать, смогу ли я ее реализовать. Я понимаю ваш пример «Не делай этого», что я ошибался. – Ric

+0

В вашем abouve струкции я не вижу, где вы дублируют функциональность @interfact AddressBookDelegate: UIViewController , так как протокол ABPeoplePickerNavigationControllerDelegate должен быть унаследован от UIViewController. Могу ли я превалировать над вами, чтобы переделать ваш пример с немного более подробной для меня? Я даю ему время, а не легкомысленно. – Ric

+0

Проведя еще некоторое время, глядя на документацию, я переписал ее. Самое большое изменение заключается в том, что вы вообще не должны использовать AppDelegate, но, скорее, сделайте любой контроллер вида, создающий адресную книгу делегата сборщика людей. – Matt