调用popToRootViewControllerAnimated:按下后退按钮

时间:2014-01-25 15:41:50

标签: ios objective-c cocoa-touch uinavigationcontroller uinavigationbar

我的iPhone应用程序中有一个UINavigationController,以深入的方式控制视图。在第二个最后一个视图中,我想通过按默认后退按钮返回到根视图。我知道方法popToRootViewControllerAnimated:就是这样做的。但是我在哪里放置它?

4 个答案:

答案 0 :(得分:3)

一种选择是在leftBarButtonItem上使用backBarButtonItem而不是self.navigationItem。即。

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(popToRootViewController:)];

然后在视图控制器中调用选择器popToRootViewController,这可以像这样实现:

-(void)popToRootViewController:(id)sender {
    [self.navigationController popToRootViewControllerAnimated:YES];
}

我看到的问题是你没有原生的后退按钮外观。

另一种选择是更改target上的selectorbackBarButtonItem属性。

[self.navigationItem.backBarButtonItem setTarget:yourTarget]
[self.navigationItem.backBarButtonItem setSelector:@selector(popToRootViewController:)]

请注意,应该在视图控制器之前的堆栈中的视图控制器上设置backBarButtonItem,您希望该按钮可见:

  

self.navigationController.viewControllers
  | ...
  |
  | - SecondViewController< - 将backBarButtonItem设置为在LastViewController上可见   | - LastViewController

答案 1 :(得分:2)

据我所知,您无法通过默认的后退按钮弹出Root ViewController,因为此默认按钮仅用于弹出到上一个视图Controller。因此,如果要回弹到根ViewController,可以在导航栏上创建自定义栏按钮,并且可以在此自定义栏按钮的选择器方法中使用popToRootViewControllerAnimated :.如果您只想使用一个后退按钮弹出到根ViewController,您可以使用以下命令隐藏默认后退按钮:

self.navigationItem.hidesBackButton = YES;

然后,您可以在导航栏上添加自定义后退按钮,通过该按钮可以弹出到根ViewController。

如果有效,请告诉我。谢谢:))

答案 2 :(得分:2)

您可以使用viewWillDisappear

-(void) viewWillDisappear {
    NSArray *viewControllers = self.navigationController.viewControllers;
    if ([viewControllers indexOfObject:self] == NSNotFound) {
      // View is disappearing because it was popped from the stack
      [self.navigationController popToRootViewControllerAnimated:YES];
  }
}

从这里获得一些代码:viewWillDisappear: Determine whether view controller is being popped or is showing a sub-view controller

当弹出视图时,此代码将弹出到根视图控制器(按下后退按钮时会发生这种情况)。

答案 3 :(得分:0)

您应该将UINavigationController子类化并覆盖方法popViewControllerAnimated(animated: Bool)

override func popViewControllerAnimated(animated: Bool) -> UIViewController? {
    guard let last = self.viewControllers.last else {
        return nil
    }
    if last.isKindOfClass(MySecondLastViewController.self) {
        return super.popToRootViewControllerAnimated(animated)![0]
    } else {
        if self.viewControllers.count >= 2 {
            return super.popViewControllerAnimated(animated)
        } else {
            return nil
        }
    }
}