按下后退按钮后弹出控制器

时间:2013-10-07 14:38:37

标签: objective-c xcode uinavigationcontroller backbarbuttonitem

我有一个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

但是当我按下第三个视图上的后退按钮时,我返回第二个视图而不是第一个视图。你能帮我回到第一个视图,按下第三个视图上的后退按钮。 我尝试了答案的建议,但他们没有帮助。

  1. 向backBarButtonItem添加选择器没有用,因为它永远不会被调用。
  2. 在viewWillDisappear中添加[self.navigationController popToRootViewControllerAnimated:YES]也不起作用。我不知道为什么。我认为实际问题是backBarButtonItem的工作原理。 还有其他建议吗?
  3. 我试图实现的行为存在于iPhone的日历中。当您将iPhone旋转到横向时,您将进入weeek视图。然后转到活动详细信息,并旋转到肖像。当您按下后退按钮时,您将进入日视图而不是周视图,因此将跳过具有周视图的控制器。

4 个答案:

答案 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