Swift 中视图控制器之间的基本转换

Posted

技术标签:

【中文标题】Swift 中视图控制器之间的基本转换【英文标题】:Basic Transitioning Between View Controllers in Swift 【发布时间】:2017-09-14 00:50:13 【问题描述】:

我正在努力实现将在 2 个视图控制器 vc1 和 vc2 之间移动的代码。

vc1 在 2 个 SKView 之间切换,而 vc2 只是在 UIView 中显示一些简单的东西。

vc1 和 vc2 都在主情节提要中。

vc1 首先显示,然后在 SKScene 中的某个点上显示为 vc2:

let currentViewController: UIViewController = (self.view?.window?.rootViewController)!
currentViewController.performSegue(withIdentifier: "VC1toVC2", sender: currentViewController)

在 vc2 中短暂延迟后,它会重新回到 vc1:

self.performSegue(withIdentifier: "VC2toVC1", sender: self)

这些segues有效。

然后,使用与上面相同的代码(使用相同的 segue):

let currentViewController: UIViewController = (self.view?.window?.rootViewController)!
currentViewController.performSegue(withIdentifier: "VC1toVC2", sender: currentViewController)

...第二次从 vc1 切换到 vc2 不起作用。也不例外,就是vc2不显示。

我发现了一些没有解决这个问题的其他帖子,例如: * Swift segue not working? - 建议 UI 更新必须在主线程中,而这个显示如何在 Swift 3 中执行此操作 - How do I dispatch_sync, dispatch_async, dispatch_after, etc in Swift 3? --- 我得到相同的结果 * 其他帖子建议使用视图控制器的 .show 或 .present 方法 --- 我得到相同的结果

有什么想法/指导吗?

【问题讨论】:

【参考方案1】:

我使用其他帖子提到的委托解决了这个问题,例如How to call method from ViewController in GameScene。委托允许 SKScene 对象在其视图控制器中调用/运行代码。这允许视图控制器执行转场,而不是尝试从 SKScene 对象执行转场(甚至不确定是否有可能,从 SKScene 对象执行转场)。如果您对 Swift 中的委托不太熟悉,这里还有一个简单的教程 https://useyourloaf.com/blog/quick-guide-to-swift-delegates/。如果对任何人有帮助,我可以发布更多详细信息。

【讨论】:

以上是关于Swift 中视图控制器之间的基本转换的主要内容,如果未能解决你的问题,请参考以下文章

ScrollView v 自定义转换 (Swift)

在 Swift 中的视图控制器之间传递数据

在 Swift 中显示和关闭模态视图控制器

创建一个 segue 并通过 Swift 在两个视图控制器之间附加它?

两个视图之间的 Swift CATransition - 滑过效果上一个屏幕变白

Swift:当键盘出现时如何让视图控制器滚动到文本字段