【问题标题】:ViewDidLoad is always calledViewDidLoad 总是被调用
【发布时间】:2017-09-14 22:53:05
【问题描述】:

我最近才开始使用 Swift,并且在 viewDidLoad 方法中遇到了一个“奇怪”的错误。

我非常简单的应用目前只有 2 个视图控制器:

  • MainViewController,它是应用程序的入口点,用作已创建数据的概览。它还提供了添加新数据的选项,这将触发对
  • 的 segue
  • DataViewController,提供 UI 以创建新数据,然后返回 MainViewController

现在我的问题是 MainViewController 的 viewDidLoad 方法总是在 MainViewController 出现时被调用(在应用程序开始时和每次 DataViewController 消失时)。特别是,总是打印消息“MainViewController new created”。

更糟糕的是,我的应用似乎正在“秘密”重置。为了说明这一点,我在 MainViewController 中定义了类变量“createView”,默认情况下为 true,并在 viewDidLoad 期间设置为 false(调用/设置此变量的唯一位置)。然而,在 MainViewController 出现后,消息“MVC new created”仍然总是打印在输出中。这个怎么可能?为什么/如何将 createView 重置为 true?

希望这个 sn-p 足以找到问题。否则,让我知道是否缺少某些东西。

感谢您的帮助!

override func viewDidLoad() 
{
    super.viewDidLoad()


    if (createView)
    {
        determineArraySize()
        createDataArray()
        print("MainViewController newly created")
        createView = false

    }
    else {print("Nothing happened")}
}

【问题讨论】:

  • DataViewController 和 MainViewController 之间的连接是什么样的?我的猜测是,您实际上是在将一个新实例推送到各种导航堆栈上。因此每次都重新创建 MainViewController。
  • 提供您实际编写代码的代码以消失您的DataViewController
  • @moritz:我使用“Show(e.g. push)”转场(只是因为它是在情节提要中创建转场时的首选)。但是,我已将类型更改为“显示详细信息”和“模态显示”。没有效果,在输出中也没有,仍然表明调用了 viewDidLoad,也没有视觉效果(我做错了什么吗?)

标签: ios swift viewdidload


【解决方案1】:

正如 @moritz 在 cmets 中提到的,请检查您在情节提要中呈现 DataViewController 的方式。

如果视图是模态显示的,你应该调用:

解雇(动画:真,完成:无)

如果视图使用显示序列呈现,您应该调用:

_ = navigationController?.popViewControllerAnimated(true)

【讨论】:

  • 感谢您的回复。正如我在对 Moritz 评论的回复中添加的那样,我使用“显示(例如推送)”segue 类型。老实说,我真的不明白我应该在哪里粘贴你提到的 LoC。我可以使用一个好的指南吗?我能找到的唯一资源是来自 Apple 的官方资源,它对我没有多大帮助。谢谢
  • 我认为问题在于您使用 segue 从 dataViewController 回到 mainViewController.. 这会生成一个新的 mainViewController 而不是回到以前的 VC。相反,请尝试将此代码添加到 DataViewController 中的按钮触摸事件中:navigationController?.popViewControllerAnimated(true) ....有关教程,请观看此视频youtube.com/watch?v=VhXhqX3NeIY
  • 感谢分享视频和信息。我基本上理解了这个问题,并且能够使用您提供的代码。但是,我不清楚一件事-您写道,如果视图以模态方式呈现,我应该使用“解雇...”。但是我发现我需要使用它,尽管我有一个“Show” Segue。可能是因为我没有使用导航堆栈控制器,而是使用手动添加的导航栏和栏按钮创建了两个单独的视图(可以选择在我的 2nd/DataVC 中使用不同的栏按钮)
  • 是的,没错!除非您在情节提要中为 mainviewcontroller 创建导航堆栈控制器,并使用 push segue 显示 dataviewcontroller,否则您不能使用 navigationController 函数。在这种情况下,dismiss 函数将不起作用。但是正如您提到的,两个视图导航栏都是手动创建的,navigationController func 将不起作用,并且 dismiss func 应该可以解决问题。如果您想自定义导航栏,可以尝试以下操作:ioscreator.com/tutorials/customizing-navigation-bar-ios8-swift
  • 非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多