【问题标题】:ViewController Appears to Transition TwiceViewController 出现两次过渡
【发布时间】: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


【解决方案1】:

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

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

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

希望这对您有所帮助。

【讨论】:

【解决方案2】:

基本上你只需要重命名目标视图控制器的类。

完整答案见这篇文章:

View Controller Loads Twice - How Do I Fix It?

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      我发现 Elena 的回答(在此线程 Pushing View Controller Twice 上)是一个节省时间的快速修复方法,只需检查导航控制器是否已经包含您要推送到的 ViewController。

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

      }

      【讨论】:

        猜你喜欢
        • 2019-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多