IOS ViewController 导航路径 - 如何以编程方式向后导航

Posted

技术标签:

【中文标题】IOS ViewController 导航路径 - 如何以编程方式向后导航【英文标题】:IOS ViewController navigation path - how to navigate back programatically 【发布时间】:2012-01-02 04:52:47 【问题描述】:

我正在使用 ios5 故事板。我的 View Controller 路径如下:

tabbarVC --> navigationVC-1 --> tableVC-1 --(via segue push)-> tableVC-2 --(via segue modal)-> navigationVC-2 --> tableVC-3

在 tableVC-3 中的取消按钮回调操作方法中,我调用 [self dismissViewControllerAnimated:YES completion:nil]; 成功让我回到 tableVC-2。但是,当我尝试在调试器中向后检查导航路径时,我看不到从 navigationVC-2 访问 tableVC-2 的方法。我希望navigationVC-2 保持到tableVC-2 或navigationVC-1 的链接,但似乎没有。请在下面查看我的调试器输出。

有人可以解释导航层次结构以及如何以编程方式向后遍历链吗?

(gdb) po self
<tableVC-3: 0x6d33340>

(gdb) po (UIViewController*) [self navigationController]
<UINavigationController: 0x6d33560>

(gdb) po (UIViewController*)[[self navigationController] navigationController]
Can't print the description of a NIL object.

(gdb) po (UIViewController*)[[self navigationController] topViewController]
<tableVC-3: 0x6d33340>

(gdb) po (UIViewController*)[[self navigationController] presentingViewController]
<UITabBarController: 0x6b2eba0>

(gdb) po (UIViewController*)[[self navigationController] presentedViewController]
Can't print the description of a NIL object.

(gdb) po (UIViewController*)[[self navigationController] visibleViewController]
<tableVC-3: 0x6d33340>

【问题讨论】:

【参考方案1】:

这是一个老问题,但为了帮助遇到此问题的其他人,有一个命令可以让您的生活更轻松..

[self.navigationController popToRootViewControllerAnimated:TRUE];

当你偶然发现正确的命令时很容易,不是吗!

因此,假设您在导航控制器中有一系列三个屏幕,并且在 第三 屏幕上,您希望“返回”按钮将您带回 初始 屏幕。

-(void)viewDidLoad

    [super viewDidLoad];

    // change the back button and add an event handler
    self.navigationItem.leftBarButtonItem =
    [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                     style:UIBarButtonItemStyleBordered
                                    target:self
                                    action:@selector(handleBack:)];



-(void)handleBack:(id)sender

    NSLog(@"About to go back to the first screen..");
    [self.navigationController popToRootViewControllerAnimated:TRUE];

【讨论】:

【参考方案2】:

在故事板中使用这个和其他几个问题来返回我使用的两个视图

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

【讨论】:

评论让我尝试[self.navigationController.navigationController popToRootViewControllerAnimated:YES];。结构类似于:导航控制器 -> 表视图 ->(通过 push segue)-> 导航控制器 -> 视图控制器。这对我有用!此外,它让我了解了事物的运作方式。【参考方案3】:

要抛出一个旧的响应,很难更新它以使其更完整。 要解决这个问题:

有人可以解释导航层次结构以及如何以编程方式向后遍历链吗?

你的导航结构:

tabbarVC --> navigationVC-1 --> tableVC-1 --(通过 segue push)-> tableVC-2 --(通过 segue modal)-> navigationVC-2 --> tableVC-3

可以这样解释: TabbarVC 显示它是“selectedViewController”(navigationVC-1)。 NavigationVC-1 的导航栈由 TableVC-1 和 TableVC-2(NavigagtionVC-1 的 topViewController)组成 然后 NavigationVC-2 以模态方式呈现在 tabbarVC 上,因此 tabbarVC 是 presentingViewController 而 NavigationVC-2 是 presentedViewController

因此,为了从 tableVC-3 到达 tableVC-2,您需要执行以下操作:

[(UINavigationController *)[(UITabBarController *)[tableVC-3 presentingViewController] selectedViewController] topViewController];

(不要在生产代码中这样做)

[tableVC-3 presentingViewController][tableVC-3.navigationController presentingViewController] 会返回给您UITabBarController


如果您使用的是 UINavigationController,您应该使用它的 pushpop 方法将 UIViewController 置于“表示堆栈”上或退出。 您将能够像这样从UIViewController 访问UINavigationController

self.navigationController

如果您想在“演示堆栈”上返回多个UIViewController,您可以在UINavigationController 上使用此方法

popToViewController:动画: 弹出视图控制器,直到指定的视图控制器位于导航堆栈的顶部。 - (NSArray *)popToViewController:(UIViewController *)viewController 动画:(BOOL)动画


要关闭以模态方式呈现的UIViewController,已呈现它的UIViewController 需要使用以下命令将其关闭:

- (void)dismissModalViewControllerAnimated:(BOOL)animated

所以在这种情况下应该是:

[tableVC-2 dismissModalViewControllerAnimated:YES];

【讨论】:

其实我的问题是不同的。请注意,我有 2 个导航控制器在使用。我的问题是如何回到第一个导航控制器。如果您看到我粘贴的调试输出,似乎没有任何方法可以返回到第一个导航控制器。 感谢 cmets。如果没有第二个导航控制器,“模态”类型的 segue 似乎不起作用(应用程序崩溃)。 @mpprdev - 好的,我明白了,我不太习惯继续使用。你不想回去你想关闭你的模态演示。 未链接到问题,但谢谢,我一直在寻找弹出功能,但没有找到导航控制器(正在寻找父控制器......现在这一切都很重要 一点说明:如果你想回到上一个视图,不作为参数传递,你可以使用下面的代码:[[self navigationController] popViewControllerAnimated:YES];【参考方案4】:

斯威夫特

如果您使用的是导航控制器,您可以使用导航回到上一个视图控制器

self.navigationController?.popViewControllerAnimated(true)

或使用

返回根视图控制器
self.navigationController?.popToRootViewControllerAnimated(true)

【讨论】:

以上是关于IOS ViewController 导航路径 - 如何以编程方式向后导航的主要内容,如果未能解决你的问题,请参考以下文章

iOS - Navigationcontroller 与带有导航栏的 Viewcontroller

如何从 iOS 中的 NSObject 类导航到 ViewController?

如何在 Xamarin for iOS 中呈现具有不同导航的 viewController

iOS - 导航栏隐藏/显示

iOS11中如何设置导航栏与ViewController内容重叠

Xamarin iOS RowSelected 事件导航到 ViewController