在 iPhone 上使用 UINavigationController 跳转到下一个控制器

Posted

技术标签:

【中文标题】在 iPhone 上使用 UINavigationController 跳转到下一个控制器【英文标题】:Jump to next controller with UINavigationController on iPhone 【发布时间】:2010-08-24 02:59:57 【问题描述】:

该程序有一个导航栏,通常当单击 viewController1 中的按钮时,它会转到 viewController2。单击 viewController2 中的按钮时,它会转到 viewController3。并且用户可以使用导航栏中的后退按钮从 viewController3 导航到 viewController2,然后导航到 viewController1。

我想制作一个按钮,以编程方式将用户直接从 viewController1 带到 viewController3。然后用户可以从 viewController3 导航回 viewController2 再到 viewController1。

有没有办法将两个视图推送到导航控制器中?还是另一种实现所需行为的方法?这个应该怎么设计?

【问题讨论】:

【参考方案1】:

很抱歉误读了您的问题。因为你想推 2 个视图控制器,然后一个一个地返回。我认为现在的解决方案很简单。

您只需要推送视图控制器 2 次,1 次没有动画,1 次有动画,如下所示:

[viewController1.navigationController pushViewController:viewController2 animated:NO];
[viewController2.navigationController pushViewController:viewController3 animated:YES];

因此,对于用户而言,就像您只推送 1 个,但在幕后,您实际上推送了 2 个视图控制器。那么当你想回来的时候,只需要一个一个地弹出即可。

【讨论】:

我会把 popToViewController 放在哪里?在 viewcontroller1 或 viewcontroller2 中 在 viewcontroller 3 中,当您处理按钮的操作时。 您说“弹出视图控制器,直到指定的视图控制器位于导航堆栈的顶部。”你在哪里指定视图控制器? 再看方法签名。 popToViewController:动画:。您必须将 viewController1 传递给参数 他正在尝试推送多个控制器,而不是弹出多个控制器。【参考方案2】:

你可以直接在 UINavigationController 上使用 . setViewControllers:animated:.

例如,假设这段代码在 viewController1 中的某个地方,就像在它的视图中按下按钮的处理程序一样:

NSMutableArray* viewControllers = [self.navigationController.viewControllers mutableCopy];
UIViewController* controller = [[MyViewController2 alloc] init];
[viewControllers addObject:controller];
[controller release];
controller = [[MyViewController3 alloc] init];
[viewControllers addObject:controller];
[controller release];
[self.navigationController setViewControllers:viewControllers animated:YES];

最重要的是使用 mutableCopy 调用创建业务,以便您保留导航堆栈中已经存在的任何内容。

【讨论】:

释放它们的位置可能取决于您保留或分配它们的位置。如果您不需要单独引用它们,那么您可以在将它们放入数组后立即释放它们,就像我在上面的示例代码中所做的那样。 这是解决问题的适当方法。推送一个没有动画的视图控制器并立即推送另一个带有动画的视图控制器是脆弱的。它对我有用(在 ios 7 中)但最近坏了(在 iOS 8 中)。【参考方案3】:

可以一次推送 2 个视图控制器,但是一旦推送第一个视图控制器,当前视图控制器上的 navigationController 属性将变为 nil,因为它不再位于堆栈顶部,因此您必须对其进行引用.我从来没有尝试过一次推动 2 个动画,我不确定那会是什么样子。

【讨论】:

其实我真的不需要显示viewController2,只是想确保我可以回到viewController2。 3->2->1 您必须在某个时候将其推送到导航控制器堆栈中。 如果你推送两个控制器,第一个推送的绝对不会变成 ni,因为导航控制器在推送的控制器堆栈中仍然有对它的引用。

以上是关于在 iPhone 上使用 UINavigationController 跳转到下一个控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的标签栏 iOS 应用程序上呈现模式 UINavigation 视图?

UINavigation setViewControllers:内存分配

UINavigation 控制器上的完成按钮没有导航回来

如何在Objective C中的UIViewController上添加UITabbar控制器和UINavigation bar

将 UIBarButtonItem 添加到 UIViewController 推送到 UINavigation 控制器

UINavigation 后退栏按钮