我的iPhone应用程序中有一个UINavigationController,以深入的方式控制视图。在第二个最后一个视图中,我想通过按默认后退按钮返回到根视图。我知道方法popToRootViewControllerAnimated:
就是这样做的。但是我在哪里放置它?
答案 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
上的selector
和backBarButtonItem
属性。
[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];
}
}
当弹出视图时,此代码将弹出到根视图控制器(按下后退按钮时会发生这种情况)。
答案 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
}
}
}