swift - 了解 Swift 中 View 之间的转换时的类型转换

标签 swift segue

我试图理解以下代码是如何工作的/为什么需要它:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
     if segue.identifier == "showPlaylistDetails" 
          let playlistDetailController = segue.destinationViewController as! PLaylistDetailViewController 
          playlistDetailController.segueLabelText = "Yay! It worked"
 }

我理解需要覆盖默认的“prepareForSegue”函数——然后指定它是一个 UIStoryboardSegue。此外,我理解需要放置一个 if 语句来检查我为此特定转场命名的标识符是否正确(以确保我正在谈论正确的转场)

但是,我迷路的是

 let playlistDetailController = segue.destinationViewController as! PlaylistDetailViewController

我做了一些研究并了解您需要将一种类型的元素向下转换为它的“真正”子类。苹果文档给出的示例是一个数组,其中包含两个单独子类的多个对象,并且需要循环遍历它们并将每个对象视为“真正的”子类,而不是视为它的父类,只是因为这是它与其他所有对象的共同点在数组中。

我不明白的是为什么我们需要让 segue.destinationViewController 充当“PlaylistDetailViewController”(我的 segue 所指向的 Controller 的名称。)

假设但尚未找到正确解释的地方是,segue.destinationViewController 是(没有双关语!:P)PlaylistDetailViewController。但是在这个函数中我需要使用segue的点方法(我假设是Class?)但是,segue没有能力引用 Controller 内部的变量(可能是因为它太模糊了?或者作为一种安全措施)预防措施,因为它可能在代码中经常使用)。

但是为什么它需要我解开 PlaylistDetailViewController ——如果我们知道它们是相同的那么我们就知道它不会返回 nil。如果可以在目的地上返回 nil (我认为不是?)为什么我们不需要解开 segue.destinationViewController ?更不用说我们正在使用一个常量 playlistDetailController - 为什么我们不直接将其设置为 if let 来展开。

似乎凭借 swift 的简单性,我们应该能够说

 segue.destinationViewController.segueLabelText = "Yay it worked!"

或者至少

PlaylistDetailViewController.segueLabelText = "Yay it worked!"

最佳答案

因为 segue.destinationViewController 可以是任何类型的 UIViewController 子类,所以它需要知道它所基于的类,以便知道它正在加载什么。它正在您定义的变量中创建类的实例。

如果您愿意,也可以使用 if let 。请参阅https://stackoverflow.com/a/29360924/4096655

关于swift - 了解 Swift 中 View 之间的转换时的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31601456/

相关文章:

ios - 从表格 View 设置动态 View 的标题

ios - 如何更新tableview json

swift - 如何使用 swift 3 从 xib View 切换到 Storyboard View Controller

swift - 在启用滚动的堆栈 View 中扩展 UITextView

swift - 在 swift 1.2 中逐行读取文件

ios - 即使我在 Storyboard 中设置了 segue,prepareForSegue 也从未被调用

swift - performSegueWithIdentifier 未执行

objective-c - 在自动 Segue 远离自身之前查看不更新

python - Swift NSSocket 编程/python 教程修复

ios - ENsideMenuNavController - 禁用与所有其他 View 的交互