如何在iOS中弹出导航控制器

10

我有3个导航控制器,每个控制器下面都有很多视图控制器。

  • 1 NavigationController(模态Segue) -> 2 NavigationController(模态Segue) -> 3 NavigationController

现在,如何从第3个导航控制器返回到之前的1个导航控制器呢? 我想要:

  • 1 NavigationController(模态Segue) -> 2 NavigationController(模态Segue) -> 3 NavigationController(怎么做?)->1 NavigationController

(为了澄清,我不想去一个新的1 NavigationController。我想回到之前用过的那个。)

帮帮我!


你是指之前的吗?只需使用popViewController返回到上一个视图控制器。而使用popToRootViewController则可以返回到第一个视图控制器。 - Nitin Gohel
不,我不想弹出一个视图控制器。我想要弹出导航控制器。 - coolcool1994
2
啊,为什么你有这么多导航控制器.. - Prathamesh Saraf
我想允许用户前后导航,但当用户转到导航控制器#2时,禁止用户返回导航控制器#1。我有很多事情要让他们阅读。每个导航控制器都有一个独特的主题。 - coolcool1994
3
你可以将导航控制器设为窗口的根视图控制器,将你的第一个视图控制器设置为导航控制器的根视图控制器。这样用户就可以通过将任何按钮的动作设置为推送操作到另一个控制器来实现前进和后退导航。如果要避免后退转换,可以使用self.navigationController.navigationItem.hidesBackButton = YES; 隐藏“返回”按钮。你也可以轻松地弹回到根视图控制器。你不需要那么多的导航控制器。 - Prathamesh Saraf
谢谢Prathamesh!我只使用了一个navigationController,并使用[self.navigationItem setHidesBackButton:YES animated:NO]来防止用户返回到以前的主题。由于转换不是模型,您无法配置转换样式,例如交叉溶解、部分卷曲,但现在这个方法可行! - coolcool1994
6个回答

22
[[self navigationController] popViewControllerAnimated:YES];

2
这个答案只是弹出当前的视图控制器,而不是弹出或关闭当前的导航控制器。 - John Pang

8
如果您想关闭整个堆栈的3个NavigationController,可以在任何一个视图控制器中调用此方法。
Objective C
[self.navigationController dismissViewControllerAnimated:YES completion:nil]

Swift 3, 4

self.navigationController?.dismiss(animated: true)

这将使状态回到 (model Segue)->3NavigationController 之前。也许你可以在3之前的2中以某种方式调用它?

在Swift3中:self.navigationController.dismiss(animated: true) - Achintya Ashok

1

使用以下代码:

[self.**presentingViewController** dismissViewControllerAnimated:YES completion:nil];

而不是:

[self dismissViewControllerAnimated:YES completion:nil];


1
navigationController1的堆栈中的视图控制器中,创建一个取消操作的@IBAction方法:

Swift

@IBAction func unwindToMyViewController(_ segue: UIStoryboardSegue)

Objective-C
- (IBAction)unwindToMyViewController:(UIStoryboardSegue *)segue

在你的故事板中,你可以从 navigationController3 栈中的视图控制器的按钮上拖动到退出图标,然后连接一个反向跳转。请保留 HTML 标签。

enter image description here

从那里,选择上面创建的取消 unwind segue。当触发时,segue 将取消所有视图控制器,返回到包含该 unwind segue 的视图控制器。


0

通过这个,您可以获得 1个导航控制器

[(UINavigationController *)self.view.window.rootViewController popViewControllerAnimated:YES];

0

这段代码将弹出一个包含所有视图控制器的导航控制器

// pop root view controller
UIViewController *rootViewController = [self.navigationController viewControllers][0];
[rootViewController dismissViewControllerAnimated:YES completion:nil];

你可以这样做:

// pop navigationController3 without animation
UIViewController *rootViewController3 = [navigationController3 viewControllers][0];
[rootViewController3 dismissViewControllerAnimated:NO completion:nil];

// pop navigationController2 with animation
UIViewController *rootViewController2 = [navigationController2 viewControllers][0];
[rootViewController2 dismissViewControllerAnimated:YES completion:nil];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接