问题概要
我的主VC -> 第二个VC转换似乎运行了两次。然而,奇怪的是第二个VC的viewDidLoad仅运行一次。这是我项目中唯一出现这个问题的转换。
我已经研究过这个问题,并发现了加载两次的问题,但没有一个与我转换两次但只加载一次的情况相符。常见问题,比如在storyboard中添加了两个segue,在我的项目中并没有出现:
在我的第一个/根视图控制器(称为mainVC)中,我在viewDidLoad中通过编程方式添加了一个边缘平移手势:
let panLeftEdgeGesture_MainVC = UIScreenEdgePanGestureRecognizer(target: self, action: "panLeftEdge_toLifeList:")
panLeftEdgeGesture_MainVC.edges = .Left
view.addGestureRecognizer(panLeftEdgeGesture_MainVC)
当用户滑动手势时,它会触发一个函数来调用一个segue到我的下一个VC。问题是,该VC转换出现两次,然后一切正常。没有任何破坏或崩溃。如果我点击我的自定义返回按钮,返回到mainVC的解开只出现一次。
揭示原因的实验
这里有个奇怪的部分: 为了理解所理解的内容,我插入了一些println代码,这里是控制台打印的内容:
No matching prepareForSegue: So did nothing to prepare.
LifeList_CollectionView viewDidLoad did run
Pan segue from mainVC to Life Lists did run
No matching prepareForSegue: So did nothing to prepare.
第一行是prepareForSegue运行。它显示"did nothing",因为在我的prepareForSegue中,它检查哪个segue正在运行,有时候会传递一些代码。在这种情况下,prepareForSegue什么也不做,只打印那一行。
第二行是第二个视图控制器的viewDidLoad运行。
第三行对我来说似乎怪怪的,顺序不对。这个println在mainVC中,从被pan手势调用的函数中打印出来,这就是触发第一个segue的函数。为什么这个不会在第二个VC的viewDidLoad之前打印出来呢?
func panLeftEdge_toLifeList(sender: UIScreenEdgePanGestureRecognizer) {
performSegueWithIdentifier("segueToLifeLists", sender: nil)
println("Pan segue from mainVC to Life Lists did run")
}
第四行是mainVC的prepareForSegue第二次运行。然而,即使我看到过渡发生了两次,但我并没有看到控制台打印第二个viewDidLoad。
有什么能导致这种奇怪行为的想法,或者至少有什么技巧可以停止这种行为吗?