ABPeoplePickerNavigationController - удалить & # 8220; Отмена & # 8221; кнопка без использования приватных методов / свойств?

StackOverflow https://stackoverflow.com/questions/1611499

Вопрос

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

Это было полезно?

Решение 3

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

Другие советы

этот

- (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]; 
}

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

В примерах, приведенных здесь, используется метод делегата 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 контроллером вида сверху контроллера навигации.

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

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

Установите делегата для контроллера 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];
}

Обязательно установите делегат для объекта средства выбора (не 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];
} 

Он отлично работает, но в 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;
}

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

согласно Расселу b, вы можете просто перезаписать свой viewdidappear

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

- (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)];
}

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

Я попытался получить желаемое поведение с помощью открытого 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];
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top