ABPeoplePickerNavigationController - удалить кнопку «Отмена», не используя частные методы / свойства? - PullRequest
5 голосов
/ 23 октября 2009

Я использую ABPeoplePickerNavigationController, подкласс UINavigationController, и в контексте я использую его по умолчанию для навигационной кнопки на правой панели «Отмена», не имеет смысла. Я не могу найти способ отключить или скрыть его, и любой используемый метод должен быть общедоступным и одобренным для магазина. Полное избавление от панели навигации (picker.navigationBarHidden = YES;) может быть вариантом, за исключением того, что после возврата к списку контактов панель навигации появляется снова. Создание подкласса ABPeoplePickerNavigationController и перехват представления viewWillAppear для попытки отмены кнопки отмены не сработали. [picker setAllowsCancel: NO]; Работает, но без документов, поэтому я ожидаю, что никогда не пройдет одобрение.

Ответы [ 10 ]

4 голосов
/ 28 ноября 2010

это

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
  UIView *custom = [[UIView alloc] initWithFrame:CGRectMake(0.0f,0.0f,0.0f,0.0f)]; 
  UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithCustomView:custom]; 
  //UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addAction)]; 
  [viewController.navigationItem setRightBarButtonItem:btn animated:NO]; 
  [btn release]; 
  [custom release]; 
}

отлично работает!

2 голосов
/ 22 апреля 2011

В примерах, приведенных здесь, используется метод делегата navigationController: willShowViewController: animated: do work, но может случиться так, что вы захотите добавить свой собственный элемент навигации в свои собственные контроллеры, и указанные параметры будут удалять все, что вы могли бы установить ваши собственные контроллеры. Вот код, который я успешно использовал, чтобы эта опция работала хорошо:

- (void)navigationController:(UINavigationController *)navigationController
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated {

    // Here we want to remove the 'Cancel' button, but only if we're showing
    // either of the ABPeoplePickerNavigationController's top two controllers
    if ([navigationController.viewControllers indexOfObject:viewController] <= 1) {

        viewController.navigationItem.rightBarButtonItem = nil;
    }
}

Обратите внимание, что в стеке контроллера навигации есть два контроллера представления: один для групп контактов и один для списка контактов. Вот почему мы не можем просто проверить, является ли viewController контроллером вида сверху контроллера навигации.

0 голосов
/ 08 марта 2013

согласно russel b вы можете просто перезаписать свой viewdidapper

это сработало для меня:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    UINavigationItem *item = (UINavigationItem *)[self.navigationBar.items lastObject];
    item.rightBarButtonItems = [[NSArray alloc] init];

    item.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addPerson)];
}
0 голосов
/ 11 декабря 2012

РЕДАКТИРОВАТЬ: см. Комментарии ниже. Теперь это иллюстрация того, чего не следует делать.

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

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

Этот код вроде работал для меня (ПРИМЕЧАНИЕ: он убивает всех правых кнопок грубой силой):

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self killCancelButton];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [super pushViewController:viewController animated:animated];
    [self killCancelButton];
}

- (UIViewController*)popViewControllerAnimated:(BOOL)animated {
    UIViewController *result = [super popViewControllerAnimated:animated];
    [self killCancelButton];
    return result;
}

- (void)killCancelButton {
    for (NSUInteger itemIdx = 0; itemIdx < self.navigationBar.items.count; itemIdx++) {
        UINavigationItem *item = [self.navigationBar.items objectAtIndex:itemIdx];
        item.rightBarButtonItems = [[NSArray alloc] init];
    }
}
0 голосов
/ 06 августа 2010

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

Способ

- (void)navigationController:(UINavigationController *)navigationController  
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated

не вызывается. Итак, я сделал это:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    id topView = pickerControllerDelegate.peoplePicker.topViewController;
    topView.navigationItem.rightBarButtonItem = nil;
}

Работает довольно хорошо.

0 голосов
/ 09 июля 2010

Обязательно установите делегат для объекта выбора (не peoplePickerDelegate, просто делегат) для класса, реализующего следующий метод:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
UIView *custom = [[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)];
UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithCustomView:custom];
[viewController.navigationItem setRightBarButtonItem:btn animated:NO];
[btn release];
[custom release];
} 
0 голосов
/ 04 июня 2010

Я еще не пробовал, но я думаю, что Uby говорит перебирать подпредставления средства выбора до тех пор, пока вы не найдете isKindOfClass: [UIBarButtonItem class], а затем вы можете изменить его свойство title. Он также может быть в массиве ItemBar навигационного бара.

0 голосов
/ 30 марта 2010

Установить делегата для контроллера PeoplePickerController. В классе делегата есть этот метод делегата.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
 UIView *pCustomView = [[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)];
 UIBarButtonItem *pBtn = [[UIBarButtonItem alloc] initWithCustomView:pCustomView];
 [viewController.navigationItem setRightBarButtonItem:pBtn animated:NO];
 [pBtn release];
 [pCustomView release];
}
0 голосов
/ 25 марта 2010

Вы можете достичь этого результата, просматривая подпредставления выбора. Просто немного скучно ...

0 голосов
/ 30 января 2010

На это нет ответа - напишите новый сборщик, если вы не можете смириться с отменой.

...