Swift:prepareForSegue和instantiateViewController

时间:2015-05-11 12:02:05

标签: ios swift uiviewcontroller uistoryboardsegue

我正在努力为我的项目中的导航提供更多通用解决方案,我一直想知道segues与手动实例化的VC。

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

e.g:

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
}

不幸的是,由于有很多控制项允许用户从各个地方调用几乎所有可能的视图,这最终会成为故事板中的完全混乱。

我真正想要的是完全删除故事板中的所有segue并以编程方式调用我的下一个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)

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

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

1 个答案:

答案 0 :(得分:1)

您应该能够通过编程方式呈现视图控制器来配置nextVC字符串“thisPost”,但是由于self.storyboard?.instantiateViewControllerWithIdentifier("DetailVC") as! DetailVC之后self.storyboard?返回一个可选值,您必须先强行打开nextVC。或者您也可以选择强制解开故事板本身

因此,您可以选择第一个选项,如下所示:

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)