Чтобы заставить ABPeoplePickerNavigationController работать как Contact App, это сложно? - PullRequest
0 голосов
/ 12 октября 2011

Я пытаюсь заставить 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?

Спасибо!

1 Ответ

0 голосов
/ 10 ноября 2011

После обновления до iOS 5 я считаю, что код нуждается в некоторой модификации.Когда ABPeoplePickerNavigationController показывает ABAccountsAndGroupsViewController (случай 1), теперь это кнопка панели обновления слева.Я не уверен, используется ли это для синхронизации контактов с сервера Exchange или какое действие он будет вызывать?

Но если я заменим кнопку по умолчанию своей собственной кнопкой обновления, мое действие не будет вызвано!И я обнаружил, что это происходит только с ABAccountsAndGroupsViewController, другие случаи все еще работают!

Поэтому, чтобы мои коды работали в iOS 5, я должен реализовать метод делегата didShowViewController NOT willShowViewController

...