ViewController似乎转换两次

Dav*_*e G 2 viewdidload ios segue uistoryboardsegue swift

问题摘要

我的mainVC - >第二次VC转换似乎运行了两次.然而,奇怪的是第二个VC的viewDidLoad只运行一次.这是我的项目中唯一存在此问题的转换.

我已经研究了这个并发现了两次加载问题,但没有一个与我的转换两次匹配,但加载一次场景.常见问题,例如在故事板中添加了两个segue的人,没有出现在我的项目中:

在此输入图像描述

在我的第一个/根视图控制器(称为mainVC)中,我以编程方式在viewDidLoad中添加边缘平移手势:

        let panLeftEdgeGesture_MainVC = UIScreenEdgePanGestureRecognizer(target: self, action: "panLeftEdge_toLifeList:")
        panLeftEdgeGesture_MainVC.edges = .Left
        view.addGestureRecognizer(panLeftEdgeGesture_MainVC)
Run Code Online (Sandbox Code Playgroud)

当用户滑动该平移手势时,它会触发一个调用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.
Run Code Online (Sandbox Code Playgroud)

第一行是prepareForSegue运行.它说"什么也没做",因为在我的prepareForSegue中它会检查哪个segue正在运行,有时它会传递一些代码.在这种情况下,prepareForSegue只会打印该行.

第二行是第二个VC的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")
}
Run Code Online (Sandbox Code Playgroud)

第四行是mainVC的第二次运行的prepareForSegue.但是,我没有看到控制台打印第二个viewDidLoad,即使在视觉上我看到转换发生两次.

知道什么可能导致这种奇怪的行为,或者至少,任何技巧来阻止这种行为?

Sae*_*ade 10

我几乎遇到了同样的问题,我的第二个VC滑了两次.问题在于我的那个segue箭头Main.storyboard.我控制 - 从第一个VC中的按钮而不是我的VC(每个VC顶部的那个小黄色圆圈)拖动,所以我删除了那个segue箭头并控制 - 从VC黄色圆圈拖到我的第二个VC并修复了问题.

这也是我使用performSegue函数的方式:

@IBAction func toSignUp(_ sender: Any) {
    performSegue(withIdentifier: "signUp", sender: nil)
}
Run Code Online (Sandbox Code Playgroud)

希望这有用.


Dav*_*e G 0

本质上,您只需重命名目标视图控制器的类即可。

完整答案请参阅这篇文章:

视图控制器加载两次 - 如何解决?