【问题标题】:Same view controller loads twice相同的视图控制器加载两次
【发布时间】:2017-09-02 21:06:53
【问题描述】:

我已经阅读了几篇关于这个问题的帖子,但没有一篇能解决我的问题。

我正在编写一个应用程序,我必须单击一个按钮(“准备”)才能转到以下 ViewController。单击按钮时,它还会在两个视图控制器之间传递数据。

问题是,当我单击按钮时,以下 ViewController 会加载两次。因此,如果我想回去,我必须通过两个相同的 ViewController 回去。

我检查了 segue、类名和文件名,但没有解决它。
我还创建了一个新项目并从头重写了所有代码,但最终它仍然无法正常工作。

但是,当我添加 prepare(forSegue:) 函数和 performSegue 函数时,我注意到问题出现了。没有它,ViewController 只会加载一次。但是当然,如​​果没有它,我无法获取视图之间传递的数据...

这是我的两个视图的截图和两个函数的代码:

First view
Second view

//    Prepare the segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "prepareSegue" {
        let timerViewController = segue.destination as! CountdownViewController
        timerViewController.timeInterval1 = waitingTime
        timerViewController.timeInterval2 = shootingTime
        timerViewController.lastSeconds = lastSeconds
        timerViewController.currentTimeInterval = waitingTime
    }
}

//    Prepare the timer when the button is pushed
@IBAction func prepareTimer(_ sender: Any) {
    performSegue(withIdentifier: "prepareSegue", sender: self)
}

【问题讨论】:

  • 您是否在 Interface Builder 中设置了 segue?
  • 在我的情况下是commentTF.becomeFirstResponder(),我只需要删除它。

标签: ios swift segue viewcontroller viewdidload


【解决方案1】:

当两个 ViewController 出现时,可能是因为你有:

  1. 情节提要上直接从按钮开始的转场
  2. IBAction 附加到您调用相同 Segue 的 performSegue 的按钮上

要解决这个问题,您需要创建一个直接从 ViewController 启动的 Segue。之后就可以使用 IBAction 和 performSegue

【讨论】:

  • 确实,我从按钮开始删除了segue,并直接从视图控制器开始将其替换为一个,它可以工作!非常感谢 Giuseppe Sapienza 和@Christian!我没有意识到这种微妙之处,而你刚刚教会了我一些东西:)
  • 不客气!永远使用这种方法,你永远不会错;)
  • @GiuseppeSapienza 你如何创建“直接从 ViewController 开始的 Segue”。看来需要从一个元素开始。
【解决方案2】:

您添加了一个 seague,还添加了一个 IBAction。如果在 InterfaceBuilder 中很好地定义了 seague,它将执行并调用您的方法。 IBAction 是将动作连接到按钮的另一种方法。如果两者都使用,则有两个操作。

【讨论】:

    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多