我正在努力为我的项目中的导航提供更多通用解决方案,我一直想知道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尚未配置或者我只是错过了详细信息?
答案 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)