プロパティオブザーバをトリガする参照プロパティを取得するにはどうすればよいですか?参照プロパティの迅速なプロパティオブザーバ
私の問題を示すために、私は1つのボタンと1つのラベルを持つシンプルなMVCプログラムを書いていました。ボタンはモデル内のカウンタをインクリメントし、ビューコントローラのラベルにカウンタの値を表示します。
問題は、(モデルに)カウンタインクリメントここで(ビューコントローラ内)
をdidSetオブザーバをトリガしないことであるモデルファイルされる:
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)
}
ここでは、ビューコントローラでありますファイル:
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を動作させることができたら、私は感謝します。
あなたはViewController
クラスが
MvcModelDelegate
に準拠して作成し、最終的にはあなたが
viewDidLoad
に
model.delegate = self
設定
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
}
}
次のあなたにデリゲートプロパティを追加MvcModel
protocol MvcModelDelegate {
func didUpdateModel(counter:Int)
}
のデリゲートを作成することができ
ファイルのあなたの質問への更新などの回答ではないなどのソリューションを投稿してください。これは、将来の訪問者が混乱を理解し、それを避けるためです。 – Bugs