【问题标题】:Pop controller after back bar button is pressed按下后栏按钮后弹出控制器
【发布时间】:2013-10-07 14:38:36
【问题描述】:

我有一个 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 旋转到横向时,您将进入周视图。然后进入活动详情,旋转至头像。当您按下返回按钮时,您将进入日视图而不是周视图,因此会跳过具有周视图的控制器。

【问题讨论】:

  • 只是在您的代码中提醒您忘记调用supper,如[super viewDidLoad][super viewDidLoad:animated]
  • 我编辑了我的代码,但这对行为没有影响。

标签: objective-c xcode uinavigationcontroller backbarbuttonitem


【解决方案1】:

经过无数次尝试,我的解决方案根本就是不使用 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

【讨论】:

  • 感谢您的回复。这个问题已经过去了一段时间,我不记得细节,但由于某些原因,我想完全使用一个后退按钮。我不会检查您的解决方案,但我相信它会起作用。
  • 没问题,因为我已经尝试了很多小时来寻找这个解决方案,我认为它应该在这里为其他有类似问题的人提供
【解决方案2】:

无需为后退按钮注册新的选择器,只需这样做:

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

【讨论】:

    【解决方案3】:

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

    -(void) viewWillDisappear:(BOOL)animated {
        if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
            [self.navigationController popToRootViewControllerAnimated:YES];
        }
        [super viewWillDisappear:animated];
    }
    

    【讨论】:

      【解决方案4】:

      我遇到了和你一样的问题,然后这样解决了:

      您可以捕获 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 是 rootviewcontroller 所以为什么不直接弹出到 rootviewcontroller。
      • 感谢您的回复。也许我做错了什么,但是当我使用你的代码选择器时没有被调用。
      • 改用 self.navigationItem.leftBarButtonItem
      • 我不能因为我的应用程序中的设计。
      • 那么你的问题不一样了,你可以在另一个问题中发布为什么你的后退按钮不起作用,但是一旦你可以捕获后退按钮,我的答案就有效
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 2012-01-01
      相关资源
      最近更新 更多