【问题标题】:Swift: Difference between prepareForSegue and instantiateViewControllerSwift:prepareForSegue 和 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 尚未配置,或者我只是错过了一个细节?

【问题讨论】:

    标签: ios swift uiviewcontroller uistoryboardsegue


    【解决方案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 方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    • 2010-10-28
    • 2015-10-04
    • 2012-08-12
    • 2011-02-18
    相关资源
    最近更新 更多