【问题标题】:How to update information on previous page of navigation controller without relaunching page?如何在不重新启动页面的情况下更新导航控制器上一页的信息?
【发布时间】:2019-11-30 22:19:33
【问题描述】:

我正在制作一个测验应用程序并拥有三个视图控制器,并且我还使用了一个导航控制器。控制器是:HomeController、LevelsController、PlayController。 级别控制器上有 100 个级别作为按钮,除了级别 1 之外的所有级别最初都是灰色的。当我完成关卡时,其他关卡按钮被解锁并变得可点击。

我的问题: 这仅在我返回 HomeController 并按下然后再次导航到 LevelsController 时才有效,当我只是从 PlayController 返回到 LevelsController 时,它不会立即更新。

这是我在关卡控制器中的代码:

import UIKit

class LevelsViewController: UIViewController {



    var levels = [String]()
    override func viewDidLoad() {
        super.viewDidLoad()

        for k in globalScore...99 {
            // print("this is \(k)")
            // print(levelButton)
            levelButton[k].isEnabled = false
            print("Have the levels updated??")
        }
    }

    override func viewWillAppear(_ animated: Bool) {
        for k in globalScore...99 {
            levelButton[k].isEnabled = false
        }
    }

    @IBOutlet var levelButton: [UIButton]!

    @IBAction func levelSelect(_ sender: UIButton) {
        self.level = sender.tag
        performSegue(withIdentifier: "LevelToPlaySegue", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        print("my name is jacobson")
        var vc2 = segue.destination as! PlayViewController
        vc2.enteredLevel = self.level
    }
}

如果在文本字段中输入正确答案,我的 PlayController 有一个键盘和一个图像,该图像会更改为新图像。我还在 PlayController 的右上角有一个分数,它分配给 globalScore。随着全局分数的增加,当用户从 PlayController 退回到 LevelsController 时,关卡页面应该有更多的关卡可供用户使用。

【问题讨论】:

  • 您能否提供有关 PlayController 的更多详细信息?它的目的是什么?
  • 我提供了更多信息和代码。

标签: swift button uinavigationcontroller uinavigationbar levels


【解决方案1】:

你需要做的是改变你的逻辑,而不是在 viewDidLoad 上使用它,你还应该添加 ViewDidAppear 和 ViewWillAppear,以便在每次打开 viewController 时调用这些方法,而不是只在第一次打开。

【讨论】:

  • 我刚刚尝试过,但遇到了同样的问题。当我回到前一个视图控制器(从 PlayController 到 LevelsController)时,它没有更新。我需要转到 HomeController,然后再次导航到 LevelsController
  • 您能提供更多代码吗?请
  • @Jasc24 为您提供了正确答案。当您在 PlayController 上按“上一个”以返回 LevelsController 时,ViewWillAppear 会在 LevelsController 内触发。因此,您需要在 ViewWillAppear 中刷新数据。如果您需要更多帮助,您需要提供 LevelsController 的代码。
  • 我对最初发布的问题进行了一些更新。请看一看。
  • 我建议您将当前可用级别存储到 UserDefault 值中,然后在返回级别控制器后与当前值进行比较。在 ViewWillAppear 中,您获得当前的 UserDefault,并遍历按钮,直到获得当前索引,这将是最新的可用级别。您必须在 PlayController 中设置 UserDefault,除非您得到正确答案,否则不会更改,并且此值将保留在您的设备上。
【解决方案2】:

Jasc24 已经回答了这个问题,但我正在写对我有用的东西。

我在我的 ViewDidLoad 中写了这个,以禁用除级别 1 之外的所有级别:

for k in 1...99 {
    levelButton[k].isEnabled = false
}

我在 ViewDidLoad 之后写了这个,只启用特定级别:

override func viewWillAppear(_ animated: Bool) {
    for k in 0...globalScore-1 {
        levelButton[k].isEnabled = true
    }
}

【讨论】:

  • 别忘了打电话给超级super.viewWillAppear(animated)
猜你喜欢
  • 2014-01-16
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 2011-07-15
  • 2011-06-15
  • 1970-01-01
相关资源
最近更新 更多