我有一个UINavigationController和一个由3个简单控制器组成的链。每个人都有一个按钮。当按下按钮时,下一个控制器被推送。 ViewController1 - > ViewController2 - > ViewController3。当我按下第三个视图上的后退按钮时,我想移动到第一个视图。使用backBarButtonItem是必须的。这是第二个控制器的代码:
#import "ViewController2.h"
static BOOL isBackButtonPressed;
@implementation ViewController2
- (void)viewDidLoad {
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"back from 3" style:UIBarButtonItemStyleBordered target:nil action:nil];
[super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated {
if (isBackButtonPressed) {
[self.navigationController popViewControllerAnimated:YES];
} else {
isBackButtonPressed = YES;
}
[super viewWillAppear:animated];
}
@end
但是当我按下第三个视图上的后退按钮时,我返回第二个视图而不是第一个视图。你能帮我回到第一个视图,按下第三个视图上的后退按钮。 我尝试了答案的建议,但他们没有帮助。
我试图实现的行为存在于iPhone的日历中。当您将iPhone旋转到横向时,您将进入weeek视图。然后转到活动详细信息,并旋转到肖像。当您按下后退按钮时,您将进入日视图而不是周视图,因此将跳过具有周视图的控制器。
答案 0 :(得分:0)
我遇到了和你一样的问题并修复了这个问题:
您可以捕获ViewController3上的后退按钮,在弹出视图之前,从导航堆栈中删除ViewController2,如下所示:
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"back from 3" style:UIBarButtonItemStyleBordered target:self action:@selector(customBackPressed:)];
}
-(void)customBackPressed:(id)sender {
NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: navigationController.viewControllers];
for (UIViewController *vc in viewControllers)
{
// If vc is ViewController2 type, remove it
}
navigationController.viewControllers = allViewControllers;
[self.navigationController popViewControllerAnimated:YES];
}
因为ViewController2不再在堆栈中,所以它将跳转到ViewController1。
此外,如果ViewController1是根视图控制器,您可以这样做:
[self.navigationController popToRootViewControllerAnimated:YES];
答案 1 :(得分:0)
无需为后退按钮注册新选择器,只需执行以下操作:
-(void)viewWillDisappear{
if ( [self.navigationController.viewControllers containsObject:self] )
//It means that the view controller was popped (back button pressed or whatever)
//so we'll just pop one more view controller
[self.navigationController popViewControllerAnimated:NO];
}
在ViewController3
viewWillDisappear
方法
答案 2 :(得分:0)
尝试在第三个视图控制器中使用它,这样您就可以检查是否按下了后退按钮并直接弹出到根视图控制器,如您所述,它是您的第一个视图控制器。
-(void) viewWillDisappear:(BOOL)animated {
if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
[self.navigationController popToRootViewControllerAnimated:YES];
}
[super viewWillDisappear:animated];
}
答案 3 :(得分:0)
经过无数次尝试后,我的解决方案根本就没有使用backBarButtonItem!无论我做什么,它总是转到以前的viewController而不是调用它的选择器
相反,我只使用 leftBarButtonItem 进行导航,因为它可以保证调用我的操作。
这是一个例子
UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 27, 22)];
[backButton setImage:[UIImage imageNamed:@"backbutton"] forState:UIControlStateNormal];
[backButton addTarget:self action:@selector(backButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
这肯定会调用backButtonPressed动作..这适用于IOS 6和7