Ios (可选,在前一行中更新,没有问题)致命错误:在展开可选值时意外发现nil

Ios (可选,在前一行中更新,没有问题)致命错误:在展开可选值时意外发现nil,ios,swift,Ios,Swift,我试着在这里(和谷歌)上搜索这个问题,但我找不到任何有用的东西(这就是为什么我要发帖的原因) 我正在为一个学校项目制作一个简单的增量游戏(非常类似于cookieclicker)。游戏的前提是用户点击一个按钮获得一枚硬币,然后可以使用他们的硬币购买升级(例如,每次点击2枚硬币的升级)。我得到了“致命错误:在展开可选值时意外发现了nil”,我不知道为什么。我有两个视图控制器,我的主控制器和菜单。我正在进行一项升级,这将给用户每秒一枚免费硬币。升级按钮位于菜单视图控制器中,但计时器位于主视图控制器中。

我试着在这里(和谷歌)上搜索这个问题,但我找不到任何有用的东西(这就是为什么我要发帖的原因)

我正在为一个学校项目制作一个简单的增量游戏(非常类似于cookieclicker)。游戏的前提是用户点击一个按钮获得一枚硬币,然后可以使用他们的硬币购买升级(例如,每次点击2枚硬币的升级)。我得到了“致命错误:在展开可选值时意外发现了nil”,我不知道为什么。我有两个视图控制器,我的主控制器和菜单。我正在进行一项升级,这将给用户每秒一枚免费硬币。升级按钮位于菜单视图控制器中,但计时器位于主视图控制器中。由于当用户在另一个视图控制器中时(因为此时不存在标签),计时器无法更新我的银行标签(显示用户有多少硬币),因此我的选择器中有if/else语句(计时器每秒运行一次的函数)依赖于名为safeCheck的变量,我在主视图控制器的视图中设置为true,将在菜单视图控制器的viewDidLoad中显示,而在菜单视图控制器的viewDidLoad中设置为false。当它为真时,一枚硬币被添加到用户的银行,并显示在银行标签上。如果为false,则会增加一个变量,该变量将在调用主视图控制器的ViewWillDisplay时添加到库中(在当前代码中不会添加这些变量)。在ViewWillDisplay中,我目前正在做两件事:第一,我更新银行标签,第二,我将safeCheck设置为true。当我退出菜单并加载主视图控制器时,会抛出“致命错误:在展开可选值时意外发现nil”。我已检查,更新银行标签不会引发错误。当我注释掉将safeCheck设置为true的行时,它停止抛出错误。在debug navigator中,更新银行文本的计时器选择器中的行显示为绿色,因此我认为这就是引发错误的原因我不知道它为什么会抛出错误,因为我的银行标签是它与之交互的唯一可选选项,ViewWillAppeal刚刚更新了银行标签,没有错误。

如果您能帮我解决这个问题,我们将不胜感激。很抱歉,这是一堵文字墙,我不知道如何缩短它,但仍然描述我的问题。下面是我的代码(只是主视图控制器的相关部分)


您可以通过使用通知来解决此问题。首先创建通知扩展名(可以在源文件中的任何位置实现):

然后在
ViewController
中添加和删除通知观察者,如下所示:

   override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)

       NotificationCenter.default.addObserver(self, selector: #selector(bankText), name: .timerUpdated, object: nil)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillAppear(animated)

        NotificationCenter.default.removeObserver(self, name: .timerUpdated, object: nil)
    }
要发布通知,请使用:

NotificationCenter.default.post(name: .timerUpdated, object: nil)

因此,基本上您可以将
ViewController().bankText()
替换为
NotificationCenter.default.post(名称:.timerUpdated,对象:nil)
来发布通知,然后触发
bankText()
方法。希望这有帮助:)。

问题是您正在这一行中实例化一个新的
ViewController
ViewController().bankText()
。此新ViewController实例的
clickBank
属性尚未解析,因为该实例从未显示。最简单的解决方案是通过删除static关键字将计时器方法转换为非静态方法。然后将
ViewController().bankText()
替换为
self.bankText()
。希望这能有所帮助。我不是想实例化一个新的视图控制器,谢谢你告诉我我这么做了。我只想打电话给bankText。我需要定时器方法是静态的,这样我就可以从我的结构中启动定时器。我需要能够从我的结构中启动计时器,以便可以从MenuViewController(我的另一个视图控制器)启动计时器。你知道有其他的方法来解决它吗?
   override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)

       NotificationCenter.default.addObserver(self, selector: #selector(bankText), name: .timerUpdated, object: nil)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillAppear(animated)

        NotificationCenter.default.removeObserver(self, name: .timerUpdated, object: nil)
    }
NotificationCenter.default.post(name: .timerUpdated, object: nil)