gpt4 book ai didi

引用属性上的快速属性观察器

转载 作者:可可西里 更新时间:2023-11-01 01:19:10 25 4
gpt4 key购买 nike

如何获取引用属性来触发属性观察器?

为了演示我的问题,我编写了一个带有一个按钮和一个标签的简单 MVC 程序。该按钮会增加模型中的计数器,并在 View Controller 的标签中显示计数器的值。

问题是计数器增量(在模型中)不会触发 didSet 观察者(在 View Controller 中)

这是模型文件:

import Foundation

class MvcModel {
var counter: Int
var message: String

init(counter: Int, message: String) {
self.counter = counter
self.message = message
}
}

// create instance
var model = MvcModel(counter: 0, message: "" )

// counting
func incrementCounter() {
model.counter += 1
model.message = "Counter Value: \(model.counter)"
//print(model.message)
}

这是 View Controller 文件:

import Cocoa

class ViewController: NSViewController {

let model1 = model

var messageFromModel = model.message {
didSet {
updateDisplayCounterLabel()
}
}

// update Label
func updateDisplayCounterLabel() {
DisplayCounterLabel.stringValue = model1.message
}

// Label
@IBOutlet weak var DisplayCounterLabel: NSTextField! {
didSet {
DisplayCounterLabel.stringValue = "counter not started"
}
}

// Button
@IBAction func IncrementButton(_ sender: NSButton) {
incrementCounter()
print("IBAction: \(model1.message)")
}
}

我猜这个问题与引用属性有关(因为我已经能够使这个程序与基于结构的模型一起工作)。

如果有人能告诉我如何处理属性观察器和引用属性并使这种 MVC 正常工作,我将不胜感激,因为我打算在实际程序中使用它。

最佳答案

您可以为 MvcModel 创建一个委托(delegate)

protocol MvcModelDelegate {
func didUpdateModel(counter:Int)
}

接下来您将委托(delegate)属性添加到 MvcModel

class MvcModel {
var counter: Int {
didSet {
delegate?.didUpdateModel(counter: counter)
}
}

var message: String
var delegate: MvcModelDelegate?

init(counter: Int, message: String) {
self.counter = counter
self.message = message
}
}

然后你让 ViewController 类符合 MvcModelDelegate 最后你设置 model.delegate = selfviewDidLoad

class Controller: UIViewController, MvcModelDelegate {

let model = MvcModel(counter: 0, message: "hello")

override func viewDidLoad() {
super.viewDidLoad()
self.model.delegate = self
}

func didUpdateModel(counter: Int) {
print("new value for counter \(counter)")
}

}

关于引用属性上的快速属性观察器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44684607/

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