ABPeoplePickerNavigationController в приложении на основе вкладок - PullRequest
4 голосов
/ 29 сентября 2011

У меня есть следующие требования: показывать ABPeoplePickerNavigationController в приложении на основе вкладок. Я много исследовал в сети и не нашел никакого полезного ответа, кроме одного здесь , реализация которого следующим образом поможет получить ABPeoplePickerNavigationController на вкладке, как показано на рисунке.

Первый снимок экрана является прямым результатом, когда я запускаю приложение, а второй снимок экрана - когда я снова нажимаю на вкладку Контакты (странно, но это правда).

-(void)awakeFromNib
{
    ABPeoplePickerNavigationController *nav = [[ABPeoplePickerNavigationController alloc] init];   
    NSMutableArray *newControllers = [NSMutableArray arrayWithArray: [self.tabBarController viewControllers]];
    int index = [newControllers indexOfObject: self];  
    [newControllers replaceObjectAtIndex: index withObject: nav];
    [self.tabBarController setViewControllers: newControllers animated: NO];
    [nav release];
}

Теперь моя проблема в том, что я могу перемещаться по контактам, но не могу установить делегата ABPeoplePickerNavigationController. Я хочу переопределить следующие методы делегата

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
}

-(BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{
}

Который я не могу установить, так как понятия не имею, где задать делегат. Пожалуйста, помогите мне так же, как мой проект на Крайнем сроке, и все другие функции завершены.

Любые трюки приветствуются. Я предполагаю, что могу создать подкласс ABPeoplePickerNavigationController и что-то сделать, но не знаю, как это сделать.

Редактировать После установки делегата, я получаю следующий сбой, когда я нажимаю на вкладку Контакты.

#0  0x00f85057 in ___forwarding___
#1  0x00f84f22 in __forwarding_prep_0___
#2  0x00d4b678 in -[ABMembersViewController membersController:shouldAllowSelectingPerson:]
#3  0x00d1df85 in -[ABMembersController abDataSource:shouldAllowSelectingPerson:]
#4  0x00d9abb9 in -[ABMembersDataSource tableView:cellForRowAtIndexPath:]
#5  0x003357fa in -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:]
#6  0x0032b77f in -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:]
#7  0x00340450 in -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:]
#8  0x00338538 in -[UITableView layoutSubviews]
#9  0x01dc8451 in -[CALayer layoutSublayers]
#10 0x01dc817c in CALayerLayoutIfNeeded
#11 0x01dc137c in CA::Context::commit_transaction
#12 0x01dc10d0 in CA::Transaction::commit
#13 0x01df17d5 in CA::Transaction::observer_callback
#14 0x00ff4fbb in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
#15 0x00f8a0e7 in __CFRunLoopDoObservers
#16 0x00f52bd7 in __CFRunLoopRun
#17 0x00f52240 in CFRunLoopRunSpecific
#18 0x00f52161 in CFRunLoopRunInMode
#19 0x018b5268 in GSEventRunModal
#20 0x018b532d in GSEventRun
#21 0x002d042e in UIApplicationMain
#22 0x00002240 in main at main.m:13

enter image description here enter image description here

Ответы [ 3 ]

3 голосов
/ 29 сентября 2011

Вам необходимо установить делегат ABPeoplePickerNavigationController после того, как вы его создали в awakeFromNib.Добавьте эту строку:

nav.peoplePickerDelegate = self;

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

1 голос
/ 29 марта 2012

Наконец, мы решили взять контроллер выбора в делегате приложения и установить его делегат только путем получения viewcontroller из массива контроллеров представления tabBarController.

1 голос
/ 29 сентября 2011

Вы пробовали установить nav.peoplePickerDelegate = self; так:

-(void)awakeFromNib
{
    ABPeoplePickerNavigationController *nav = [[ABPeoplePickerNavigationController alloc] init];   
    nav.peoplePickerDelegate = self;
    NSMutableArray *newControllers = [NSMutableArray arrayWithArray: [self.tabBarController viewControllers]];
    int index = [newControllers indexOfObject: self];  
    [newControllers replaceObjectAtIndex: index withObject: nav];
    [self.tabBarController setViewControllers: newControllers animated: NO];
    [nav release];
}

И в вашем @interface вы можете указать, что вы являетесь делегатом с ABPeoplePickerNavigationControllerDelegate:

@interface MyCustomViewController : UIViewController <ABPeoplePickerNavigationControllerDelegate> {

    // ....
}
...