Swift:prepareForSegue 和 instantiateViewController 之间的区别

Posted

技术标签:

【中文标题】Swift:prepareForSegue 和 instantiateViewController 之间的区别【英文标题】:Swift: Difference between prepareForSegue and instantiateViewController 【发布时间】:2015-05-11 12:02:04 【问题描述】:

我正在尝试为我的项目中的导航获取更多通用解决方案,并且我一直想知道 segue 与手动实例化的 VC 的区别。

我这样做的方式是,我在 Storyboard 中拥有从一个视图到另一个集合的所有可能的 segues,并在触摸特定元素时调用它们。

例如:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

        if segue.identifier == "showDetail" 

            let c = segue.destinationViewController as? DetailVC

            let indexPath = self.collectionView.indexPathsForSelectedItems()
            let myPath: AnyObject = indexPath[0]
            let post = self.myCollection[myPath.item].id

            println(post)

            controller?.thisPost = post

        
    //else do stuff for other identifiers

不幸的是,由于有很多控制项允许用户从任何地方调用几乎所有可能的视图,这最终导致 Storyboard 完全混乱。

我真正想要的是完全删除情节提要中的所有转场,并以编程方式调用我的下一个 VC,具体取决于所点击的项目。

即类似于:

var nextVC = self.storyboard?.instantiateViewControllerWithIdentifier("DetailVC") as! DetailVC
let itemToShow = //collectionView selected cell.id
nextVC.thisPost = itemToShow
self.presentViewController(nextVC, animated: true, completion: nil)

在显示视图之前,我实际上一直在配置 nextVC 字符串“thisPost”。与 prepareForSegue 相反,它不允许我访问 nextVC.thisPost。

我是否必须通过协议/委托来执行此操作,因为 VC 尚未配置,或者我只是错过了一个细节?

【问题讨论】:

【参考方案1】:

您应该也可以通过以编程方式显示视图控制器来配置 nextVC 字符串“thisPost”,但您必须先强制​​解开 nextVC,因为self.storyboard?.instantiateViewControllerWithIdentifier("DetailVC") as! DetailVC 由于self.storyboard? 后面的问号返回一个可选值,或者您也可以选择强制解开情节提要本身

因此,您可以在如下所示的第一个选项之间进行选择:

var nextVC = self.storyboard?.instantiateViewControllerWithIdentifier("DetailVC") as! DetailVC
let itemToShow = //collectionView selected cell.id
nextVC!.thisPost = itemToShow
self.presentViewController(nextVC, animated: true, completion: nil)

或第二个:

var nextVC = self.storyboard!.instantiateViewControllerWithIdentifier("DetailVC") as! DetailVC
let itemToShow = //collectionView selected cell.id
nextVC.thisPost = itemToShow
self.presentViewController(nextVC, animated: true, completion: nil)

【讨论】:

所以故事板?推翻 as!投进我的版本?并将整个 nextVC 设置为 Optional(DetaliVC) ? 是的,没错。通过在storyboard 之后放置? 意味着如果情节提要为nil,则立即返回nil,如果不调用其instantiateViewControllerWithIdentifier 方法

以上是关于Swift:prepareForSegue 和 instantiateViewController 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

通过 prepareForSegue 传递 NSString - Swift

Swift:如何在 UICollectionViewCell 中使用“prepareForSegue”?

prepareForSegue 不适用于自定义 segue (swift)

Swift:PrepareForSegue 正在运行但未加载 ViewController

在 Swift 2 中通过“prepareForSegue”传递数据

(Swift) PrepareForSegue: 致命错误: 在展开可选值时意外发现 nil