iPhone:如何覆盖导航控制器中的后退按钮?

时间:2011-01-07 20:49:20

标签: iphone objective-c ios4

在我的应用中,我有一个基本的导航控制器。对于我的所有视图,除了一个,控制器都可以正常工作。

但是,特别是对于一个视图,我希望“后退”按钮不会返回上一个视图,而是转到我设置的视图。特别是它将返回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];
}   

}

这没用,有没有人有任何想法?

谢谢!

4 个答案:

答案 0 :(得分: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:方法来弹出堆栈中的两个项目,也许使用我上面发布的代码。

答案 1 :(得分:4)

简单的解决方案:

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

答案 2 :(得分:2)

您可以尝试实施UINavigationBarDelegate委托。调用方法-navigationBar:didPopItem:后,您可以从UINavigationController中弹出其他项目,从而一次弹出两个项目。

答案 3 :(得分:-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;