如何在不重新启动页面的情况下更新导航控制器上一页的信息?
How to update information on previous page of navigation controller without relaunching page?
我正在制作一个测验应用程序并拥有三个视图控制器,并且我还在使用一个导航控制器。这些控制器是: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 有一个键盘和一个图像,如果在文本字段中输入正确答案,该图像会更改为新图像。我在分配给 globalScore 的 PlayController 的右上角也有一个分数。随着全局分数的增加,当用户从 PlayController 返回到 LevelsController 时,关卡页面应该有更多可供用户使用的关卡。
你需要做的是改变你的逻辑,而不是在viewDidLoad上使用它,你还应该添加ViewDidAppear和ViewWillAppear,以便每次打开时调用这些方法viewController而不是做这是第一次。
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
}
}
我正在制作一个测验应用程序并拥有三个视图控制器,并且我还在使用一个导航控制器。这些控制器是: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 有一个键盘和一个图像,如果在文本字段中输入正确答案,该图像会更改为新图像。我在分配给 globalScore 的 PlayController 的右上角也有一个分数。随着全局分数的增加,当用户从 PlayController 返回到 LevelsController 时,关卡页面应该有更多可供用户使用的关卡。
你需要做的是改变你的逻辑,而不是在viewDidLoad上使用它,你还应该添加ViewDidAppear和ViewWillAppear,以便每次打开时调用这些方法viewController而不是做这是第一次。
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
}
}