Заставить ABPeoplePickerNavigationController работать как приложение Contact слишком сложно?

#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