2009-10-05 2 views
2

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

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

Спасибо :)

ответ

4

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

Ничего плохого в собственности navigationItem UIViewController в? Вот как я кнопка отмены, например:

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

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

0

В ViewController родителей,

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

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

Если подкласс навигационного контроллера, вы можете реализовать 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]; 
} 

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

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

Смежные вопросы