Я пытаюсь заставить ABPeoplePickerNavigationController работать как Contact App и считаю, что это слишком сложно.Я не уверен, что это потому, что я сделал это неправильно, или это просто так.
Первая задача - избавиться от кнопки «Отмена» на правой кнопке панели.Следующий код НЕ работает!
picker.navigationItem.rightBarButtonItem = nil;
Некоторое время я был сбит с толку, а затем обнаружил, что это потому, что CancelLight rightBarButtonItem принадлежит подпредставлению ABPeoplePickerNavigationController, например, ABPersonViewController, но НЕ сам ABPeoplePickerNavigationController!И это причина.Это легко проверить, просто распечатав picker.navigationItem.rightBarButtonItem, он всегда равен nil.
Поэтому я реализую ABPeoplePickerNavigationController.delegate (не peoplePickerDelegate).Но для его реализации потребовалось немало хитростей, и это вызывает у меня вопросы.
Итак, сначала код:
#pragma mark UINavigationControllerDelegate methods
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
switch ([navigationController.viewControllers count]) {
case 1:
viewController.navigationItem.rightBarButtonItem = nil;
break;
case 2: {
UIBarButtonItem *addButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addButtonClicked)];
[viewController.navigationItem setRightBarButtonItem:addButtonItem animated:NO];
[addButtonItem release];
break;
}
case 3: {
UIBarButtonItem *editButtonItem;
if ([viewController isKindOfClass:[ABPersonViewController class]]) {
editButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(editButtonClicked:)];
self.personView = (ABPersonViewController*) viewController;
self.personView.allowsEditing = YES;
[viewController.navigationItem setRightBarButtonItem:editButtonItem animated:NO];
[editButtonItem release];
} else {
//ABPersonNewViewController
//No need to add codes here
}
break;
}
default: {
UIBarButtonItem *cancelButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(addButtonClicked)];
[viewController.navigationItem setRightBarButtonItem:cancelButtonItem animated:NO];
[cancelButtonItem release];
break;
}
}
}
Первая странная вещь здесь заключается в том, что когда ABPeoplePickerNavigationController содержит только 1 или 2 подпредставления, здесь случай 1 и случай 2, viewController это ABAccountsAndGroupsViewController, ABMembersViewController соответственно.
ABAccountsAndGroupsViewController и ABMembersViewController не являются общедоступным API для AddressBookUI, поэтому я не могу получить к ним доступ напрямую (я получил их, распечатав их имена).Вот почему я проверяю счетчик viewControllers вместо этого.Итак, мой первый вопрос: почему Apple не использует публичный API?
Второй вопрос касается ABPersonViewController (пример 3).Если это ABNewPersonViewController, его навигационный элемент может правильно отображать «Отмена» и «Готово» UIBarButtonItem.Мне не нужно ничего делать там.
Но если это ABPersonViewController, UIBarButtonItem "Cancel" по-прежнему отображается как rightBarButtonItem вместо кнопки Edit (даже если я установил allowEditing в YES).Поэтому я должен установить его вручную.Но почему ??Есть ли лучший способ сделать это?
И есть ли лучший способ, чем код, который я написал здесь, чтобы заставить ABPeoplePickerNavigationController работать как Contact App?
Спасибо!