从视图控制器显示(例如推送)到导航控制器有效?!为啥?

Posted

技术标签:

【中文标题】从视图控制器显示(例如推送)到导航控制器有效?!为啥?【英文标题】:Show(e.g. Push) from a viewcontroller to a navigation controller works?! Why?从视图控制器显示(例如推送)到导航控制器有效?!为什么? 【发布时间】:2015-07-25 08:50:26 【问题描述】:

所以我是 ios 编程新手,我使用的是 Swift 语言。 在做了几个初学者应用程序之后。我在弄清楚 Show(e.g. Push) 和已弃用的 Push segues 之间的区别时遇到了一些麻烦。

我想要做的是从 ViewController A(嵌入 Navigation Controller B)显示/推送到 Navigation Controller C (包含一个View Controller D)。

自从我禁用“使用尺寸等级”后,Push segue 不起作用并会报告错误“推送到导航控制器不是支持”。这个错误是有道理的,因为您只能推送常规视图控制器。

但是,当我启用 “使用尺寸类别”(将 Viewcontroller 变成正方形而不是矩形)时,我能够显示(例如 Push)到导航控制器,这真的让我很困惑。

那么 Show(e.g. Push) 和已弃用的 Push 之间的主要区别是什么?据我所知,没有重大的功能差异,但事实似乎证明我错了,让我感到困惑..

【问题讨论】:

【参考方案1】:

更新:

我重新创建了您观察到的行为。 Show (e.g Push) segue 确实可以从嵌入在 navigationController 中的一个 viewController 到嵌入在不同 navigationController 中的第二个 viewController。

请注意,当推送发生时,第二个 viewController 会以正常推送方式滑入,并出现一个返回按钮,将您带回第一个 viewController。这告诉您第二个 viewController 实际上被推送到第一个 navigationController 的堆栈上。因此,它没有给您错误消息,而是简单地忽略了您的第二个 navigationController。

使用navigationController 时,只有第一个viewController 被嵌入navigationController。您不必将后续 viewController 嵌入到 navigationController 中,因为当您从 navigationController 堆栈中的前一个 viewController 连接 Push segue 时,Storyboard 将识别出这个新 viewController 由 navigationController 控制它会在顶部添加导航栏。


原答案:

Show(例如 Push) 转场是一种自适应转场。它会根据情况选择正确的 segue 类型。

如果您的源 viewController 嵌入在导航控制器中,它会执行 Push。 如果您的源 viewController 在没有 NavigationController 的 SplitViewController 中,它会执行 Replace。 在所有其他情况下,它执行模态转场。

所以,它之所以有效,是因为它实际上是在您的情况下执行 Modal 转场,如果您不使用尺寸类,它会有效。您会注意到呈现的 viewController 实际上是从底部滑入的,这是 Modal segue 的标志。

您可以在此处找到有关它的信息: Backward Compatibility of Active Segues.

【讨论】:

感谢您的回答!根据您的回答,我的案例之所以有效,是因为它实际上是在进行模态转场?但是为什么屏幕实际上是从右侧移动到覆盖源视图控制器的顶部,看起来像一个 Push segue? 基本上我想做的是从 ViewController A(嵌入导航控制器 B)显示/推送到导航控制器 C(包含视图控制器 D)。当我使用 Show 时,它实际上给了我一个 Push 效果(屏幕从右侧滑动) 非常感谢您更新的答案!解决了困扰我好几天的问题!由于“声誉”限制,我不能赞成这个答案。谢谢!

以上是关于从视图控制器显示(例如推送)到导航控制器有效?!为啥?的主要内容,如果未能解决你的问题,请参考以下文章

从嵌套在 UITabBarController 中的导航控制器推送视图控制器?

无法从 appdelegate 推送视图控制器

导航项标题视图 - 所有推送视图控制器都相同

如何在推送通知中导航到另一个视图控制器

从推送视图访问第一个导航控制器中的方法和变量

推送导航控制器堆栈后视图不显示