gpt4 book ai didi

ios - Swift MVC : Having viewController observe Model property, 在属性更改时更新 View

转载 作者:行者123 更新时间:2023-11-28 05:36:26 25 4
gpt4 key购买 nike

我的模型的主要类是 Concentration,它有一个名为 flipCount 的属性

class Concentration {
@objc var flipCount = 0

在我的 ViewController 中,我有一个 @IBOutlet 到一个名为 flipCountLabel 的 UILabel

class ViewController: UIViewController {
lazy var game = Concentration(numberOfPairsOfCards: self.cardButtons.count / 2)
@IBOutlet weak var flipCountLabel: UILabel!
...

我想在 flipCount 更改时更新 flipCountLabel 中的文本。我试图通过在我的 ViewController 的 viewDidLoad 方法中调用 UIViewController 的观察方法来做到这一点。有几种观察方法。我不知道哪个是正确的,也找不到有关如何用什么填充变量的示例。

我试过像这样使用 self.observe

    self.observe(KeyPath<Concentration,Int>(game, "flipCount"), changeHandler: {
self.flipCountLabel.text = "Flip Count: \(flipCount)"
})

每次更新 game.flipCount 时,我都会尝试更新 ViewControllers flipCountLabel.text。我认为这是 kvo?

最佳答案

observe 方法是到达此处的方式,只要对您的代码进行一些更改即可。

将您的 Concentration 类更改为以下内容:

class Concentration: NSObject {
@objc dynamic var flipCount = 0
}

为了让 KVO 在 Swift 中工作,属性需要用 @objcdynamic 标记。该类需要继承自 NSObject 以防止运行时错误。

您的 ViewController 类应该如下所示:

class ViewController: UIViewController {
@objc lazy var game = Concentration()
@IBOutlet weak var flipCountLabel: UILabel!

private var observation: NSKeyValueObservation?

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

self.observation = self.observe(\.game.flipCount) { _, _ in
self.flipCountLabel.text = "\(self.game.flipCount)"
}
}

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

self.observation = nil
}
}

game 属性需要标记为@objc(再次防止运行时错误)。此外,documentation observe 方法的状态

when the returned NSKeyValueObservation is deinited or invalidated, it will stop observing

这就是为什么您需要对 observe 方法返回的值保持强引用。

另外,请考虑使用我在此处使用的 KeyPath 表示法。如果输入错误,编译时会失败,而不是在运行时。

希望对您有所帮助!

关于ios - Swift MVC : Having viewController observe Model property, 在属性更改时更新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58513196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com