0

我有一个 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 是如何工作的。还有其他建议吗?

我尝试实现的行为存在于 iPhone 的日历中。当您将 iPhone 旋转到横向时,您将进入周视图。然后进入活动详情,旋转至头像。当您按下后退按钮时,您将进入日视图而不是周视图,因此会跳过带有周视图的控制器。

4

4 回答 4

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方法中

于 2013-10-07T14:51:27.640 回答
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]; 
于 2013-10-07T14:47:38.000 回答
0

尝试在您的第三个视图控制器中使用它,这样您可以检查您是否按下了后退按钮并直接弹出到根视图控制器,如您所说,这是您的第一个视图控制器。

-(void) viewWillDisappear:(BOOL)animated {
    if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
        [self.navigationController popToRootViewControllerAnimated:YES];
    }
    [super viewWillDisappear:animated];
}
于 2013-10-07T14:52:36.690 回答
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

于 2014-09-13T07:26:05.343 回答