我试图理解以下代码是如何工作的/为什么需要它:
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/