iPhone – изменить цель или селектор для кнопки «Назад» на UINavigationController

Поведение по умолчанию при нажатии UIViewController на UINavigationController заключается в том, что ОС отображает кнопку «Назад», которая снова отключает UIViewController.

У меня есть желание установить другое поведение для этой кнопки «Назад» (чтобы вернуться на два экрана назад) — в любом случае я могу сделать это без необходимости создавать собственную кнопку «Назад» с настраиваемой графикой и т. д.

Спасибо :)


person adam    schedule 05.10.2009    source источник


Ответы (5)


Как я изначально подозревал, это невозможно каким-то исключительно простым способом. Такой же метод применяется при создании любого пользовательского UIBarButtonItem, просто нужно получить значок кнопки «Назад» из Google....

UIButton *backButtonInternal = [[UIButton alloc] initWithFrame:CGRectMake(0,0,54,30)];
[backButtonInternal setBackgroundImage:[UIImage imageNamed:@"backButton.png"] forState:UIControlStateNormal];
boldSystemFontOfSize:12]];
[backButtonInternal addTarget:self action:@selector(backButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithCustomView:backButtonInternal];   
[backButtonInternal release];
[[self navigationItem] setLeftBarButtonItem:backBarButton];
[backBarButton release];
person adam    schedule 06.10.2009

Использование «leftBarButtonItem» позволяет вам установить цель и селектор. Но если вы установите «backBarButtonItem» на предыдущем контроллере, цель и селектор будут проигнорированы. Однако у leftBarButtonItem нет стрелки, указывающей влево.

person gstroup    schedule 14.10.2010

Что-то не так со свойством navigationItem UIViewController? Вот как я получаю кнопку отмены, например:

self.navigationItem.leftBarButtonItem =
  [[[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemCancel
                                               target: self
                                               action: @selector(cancel)] autorelease];  
person jamie    schedule 08.07.2010

В родительском контроллере просмотра

- (void)viewDidLoad
{    
    self.navigationController.delegate= self;
}

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (viewController == self)
    {
        // your codes
    }
}
person conrkim    schedule 02.04.2011

Если вы подклассируете свой навигационный контроллер, вы можете реализовать метод popViewControllerAnimated: и бросить туда isKindOfClass: check, чтобы определить, выталкивается ли контроллер представления, который вы ищете. Например:

- (UIViewController *)popViewControllerAnimated:(BOOL)animated
{
    //Reference current controller being displayed
    UIViewController *currentController = [self.viewControllers lastObject];

    //Check class
    if ([currentController isKindOfClass:[MyDesiredController class]]) {
        NSLog(@"Popping Desired Controller, Do Stuff Here");
    }

    return [super popViewControllerAnimated:animated];
}

Однако это не отменяет фактическое появление контроллера представления (возврат nil остановит появление контроллера, но все равно приведет к тому, что панель навигации вытолкнет его информацию, а возврат NO методу shouldPop: делегат панели навигации все равно вытолкнет независимо от этого. Я слышал, что это происходит только при использовании навигационного контроллера, но я не проверял это).

Однако в вашей ситуации, поскольку вы хотите вернуть два контроллера представления обратно, вы можете удалить второй последний контроллер представления из свойства viewcontrollers навигационного контроллера, преобразовав контроллеры представления в nsmutablearray, удалив контроллер, а затем преобразовав этот nsmutablearray обратно в массив и установить его как свойство viewcontrollers навигационного контроллера. Я не проверял это, но решил поделиться идеей.

person Adam Eisfeld    schedule 30.01.2013