【发布时间】:2015-11-24 03:25:28
【问题描述】:
问题总结
我的 mainVC --> 第二个 VC 转换似乎运行了两次。然而,奇怪的是第二个 VC 的 viewDidLoad 只运行一次。这是我的项目中唯一存在此问题的过渡。
我对此进行了研究,发现了两次加载的问题,但没有一个与我的转换匹配两次但加载一次的情况。常见问题,例如有人在情节提要中添加了两个 segue,不会出现在我的项目中:
在我的第一个/根视图控制器(称为 mainVC)中,我以编程方式在 viewDidLoad 中添加边缘平移手势:
let panLeftEdgeGesture_MainVC = UIScreenEdgePanGestureRecognizer(target: self, action: "panLeftEdge_toLifeList:")
panLeftEdgeGesture_MainVC.edges = .Left
view.addGestureRecognizer(panLeftEdgeGesture_MainVC)
当用户滑动该平移手势时,它会触发一个函数,该函数调用我的下一个 VC 的 segue。问题是,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。它说“什么也没做”,因为在我的 prepareForSegue 中它会检查正在运行的 segue,有时它会传递一些代码。在这种情况下,prepareForSegue 只打印该行。
第二行是第二个VC的viewDidLoad正在运行。
第三行对我来说似乎很奇怪而且乱七八糟,但我不是专家。该 println 在 mainVC 中并从平移手势调用的函数中打印,这是首先触发 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,尽管我在视觉上看到转换发生了两次。
知道什么会导致这种奇怪的行为,或者至少有什么技巧可以阻止这种行为吗?
【问题讨论】:
-
您是否在源视图控制器中的任何位置访问目标视图控制器的视图?这将触发它在 segue 之前加载。
-
您的意思是通过协议或其他方式?无论如何,我认为答案是否定的。我没有向它传递任何数据(因此不需要 prepareForSegue 代码),并且第二个 VC 不符合除了其中的 UICollectionView 之外的任何委托。
标签: ios swift segue uistoryboardsegue viewdidload