ViewController似乎转换两次

时间:2015-08-29 16:49:25

标签: ios swift segue uistoryboardsegue viewdidload

问题摘要

我的主要VC - >第二次VC转换似乎运行两次。然而,奇怪的是第二个VC的viewDidLoad只运行一次。这是我项目中唯一出现此问题的过渡。

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

enter image description here

在我的第一个/根视图控制器(称为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运行。它说“什么都不做”,因为在我的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")
}

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

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

3 个答案:

答案 0 :(得分:10)

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

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

@IBAction func toSignUp(_ sender: Any) {
    performSegue(withIdentifier: "signUp", sender: nil)
}

希望这有用。

答案 1 :(得分:0)

一个原因可能是被推动的控制器在其viewWillAppear()方法中有另一个转换。

就我而言,我已将textField.becomesFirstResponder()放入viewWillAppear()方法中,触发键盘显示

将任何此类方法移至viewDidAppear()

答案 2 :(得分:0)

通过简单地检查导航控制器是否已经包含要推送的ViewController,我发现Elena的答案(在该线程Pushing View Controller Twice上)是节省时间的快速解决方案。

if !(self.navigationController!.viewControllers.contains(editView)){
self.navigationController?.pushViewController(editView, animated:true)

}