2011-01-07 3 views
5

В моем приложении у меня есть базовый навигационный контроллер. Для всех моих взглядов, кроме одного, контроллер работает так, как должен.iPhone: Как переопределить кнопку «Назад» в навигационном контроллере?

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

После выполнения некоторых исследований я обнаружил, что я могу перехватить взгляд, когда он исчезает, так что я пытался поставить в код, чтобы он перейти на страницу, я хотел бы:

- (void)viewWillDisappear:(BOOL)animated { 
[super viewWillDisappear:animated]; 
//i set a flag to know that the back button was pressed 
if (viewPushed) { 
    viewPushed = NO; 
} else { 
    // Here, you know that back button was pressed 
    mainMenu *mainViewController = [[mainMenu alloc] initWithNibName:@"mainMenu" bundle:nil]; 
    [self.navigationController pushViewController:mainViewController animated:YES]; 
    [mainViewController release]; 
} 

}

Это не сработало, и у кого-нибудь есть идеи?

Спасибо!

ответ

12

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

Попробуйте это, как ваш код, который делает восходящие два уровня:

NSArray *vcs = [self.navigationController viewControllers]; 
[self.navigationController popToViewController:[vcs objectAtIndex:[vcs count]-3]; 

В качестве альтернативы вы можете полностью заменить кнопку назад с кнопкой самостоятельно? В вашем ViewController:

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(doSomething:)]; 

self.navigationItem.hidesBackButton = YES; 
self.navigationItem.leftBarButtonItem = item; 
[item release]; 

Тогда вы можете написать DoSomething: метод совать два элемента из стека, возможно, используя код, который я написал выше.

+0

Пока что отлично работает! Благодарю за ваш ответ!! Я смог создать пользовательскую кнопку, создать метод и построить массив со списком открытых представлений. Тем не менее, я получаю ошибку «uncached exception», когда я перешагиваю строку popToViewController ... Я даже пробовал это: [self.navigationController popToViewController: [vcs objectAtIndex: 1]]; но безрезультатно. Сейчас я больше разбираюсь в popToViewController. –

+0

В итоге я использовал: [self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex: 0] анимированный: ДА]; вернуться назад два уровня .. отлично работает до сих пор, так что спасибо! –

+0

Если вы хотите вернуться на верхний уровень, есть popToRootViewControllerAnimated: он должен работать. –

2

Вы можете попробовать выполнить делегат UINavigationBarDelegate. Когда вызывается метод -navigationBar:didPopItem:, вы можете поместить дополнительный элемент из UINavigationController и, таким образом, поместить два элемента одновременно.

+0

Это также более или менее способ переопределить метод UINavigationController popViewControllerAnimated например, для подтверждения навигации назад. С той разницей, что вы должны использовать метод навигации (BOL) navigationBar: (UINavigationBar *) navigationBar shouldPopItem: (UINavigationItem *) для UINavigationBarDelegate. –

3

Простое решение:

- (void)viewWillDisappear:(BOOL)animated { 
    //if true, back was pressed 
    if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) { 
      //your logic 
    } 
} 
+0

Чистое решение. Работает на iOS 9. Спасибо. –

+0

Что делать, если я хочу проверить состояние перед тем, как перейти назад, и если это условие терпит неудачу. Затем я хочу остановить его, чтобы вернуться назад. вы знаете окна или андроид, тогда я хочу что-то вроде e.handled = true, как вещь. – Yawar

-1
UIButton *home = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *homeImage = [UIImage imageNamed:@"back.png"]; 
[home setBackgroundImage:homeImage forState:UIControlStateNormal]; 
[home addTarget:self action:@selector(LogOut) 
forControlEvents:UIControlEventTouchUpInside]; 
home.frame = CGRectMake(0, 0, 69, 26); 
UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithCustomView:home]; 
[[self navigationItem] setLeftBarButtonItem:button2]; 
[button2 release]; 
button2 = nil; 
Смежные вопросы