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