iPhone - Изменить цель или селектор для кнопки «Назад» на UINavigationController - PullRequest
2 голосов
/ 05 октября 2009

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

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

Спасибо:)

Ответы [ 5 ]

4 голосов
/ 06 октября 2009

Как я и подозревал наполовину, это невозможно сделать каким-то исключительно простым способом. Тот же метод применяется при создании любого пользовательского 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];
2 голосов
/ 15 октября 2010

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

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

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

- (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 контроллера навигации, преобразовав viewcontrollers в nsmutablearray, удалив контроллер, а затем преобразовав этот nsmutablearray. вернуться к массиву и установить его в качестве свойства viewcontrollers контроллера навигации. Я не проверял это, но думал, что поделюсь этой идеей.

0 голосов
/ 02 апреля 2011

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

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

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (viewController == self)
    {
        // your codes
    }
}
0 голосов
/ 08 июля 2010

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

self.navigationItem.leftBarButtonItem =
  [[[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemCancel
                                               target: self
                                               action: @selector(cancel)] autorelease];  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...