#ios4 #contacts #abaddressbook #abpeoplepickerview #abpersonviewcontroller
#ios4 #Контакты #abaddressbook #abpeoplepickerview #abpersonviewcontroller
Вопрос:
Я пытаюсь заставить ABPeoplePickerNavigationController работать как приложение Contact и считаю, что это слишком сложно. Я не уверен, связано ли это с тем, что я сделал это неправильно или так оно и есть.
Первая задача — избавиться от кнопки отмены на правой панели. Следующий код НЕ работает!
picker.navigationItem.rightBarButtonItem = nil;
Некоторое время я был в замешательстве, а затем узнал, что это связано с тем, что элемент отмены rightBarButtonItem принадлежит подразделу ABPeoplePickerNavigationController, который содержит, например, ABPersonViewController, но НЕ сам ABPeoplePickerNavigationController! И это причина. Это легко проверить, просто распечатайте picker.navigationItem.rightBarButtonItem, он всегда равен нулю.
Итак, я реализую 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, его navigationItem может корректно отображать UIBarButtonItem «Отмена» и «Готово». Мне там ничего не нужно делать.
Но если это ABPersonViewController, элемент UIBarButtonItem «Отмена» по-прежнему отображается как rightBarButtonItem вместо кнопки редактирования (даже я установил для allowsEditing значение YES ). Поэтому я должен установить его вручную. Но почему?? Есть ли лучший способ сделать это?
И есть ли лучший способ, чем код, который я написал здесь, заставить ABPeoplePickerNavigationController работать как приложение Contact?
Спасибо!
Комментарии:
1. Еще один вопрос, который забыл задать: когда пользователь выбирает свойство person из ABPersonViewController, есть 2 места, где мы можем добавить коды, чтобы решить, разрешаем ли мы пользователю предпринимать действия или нет. Во-первых, это метод ABPersonViewControllerDelegate shouldPerformDefaultActionForPerson, во-вторых, это метод ABPeoplePickerNavigationControllerDelegate Should continueaafterselectingperson . Итак, в чем разница между ними, какой из них лучше?
Ответ №1:
После обновления до iOS 5 я обнаружил, что код нуждается в некоторой модификации. Когда ABPeoplePickerNavigationController показывает ABAccountsAndGroupsViewController (случай 1), теперь это кнопка обновления панели слева. Я не уверен, используется ли это для синхронизации контактов с сервера Exchange или какое действие это вызовет?
Но если я заменю кнопку по умолчанию своей собственной кнопкой обновления, мое действие не будет вызвано! И я обнаружил, что это происходит только с ABAccountsAndGroupsViewController, другие случаи все еще работают!
Итак, чтобы мои коды работали в iOS 5, я должен реализовать метод делегирования didShowViewController, А НЕ willShowViewController