【发布时间】:2020-01-06 12:26:17
【问题描述】:
我正在学习 SwiftUI 并尝试使用 MVVM 模式实现一个简单的 Timer。但是 Timer 的视图不会重新渲染。有什么问题?
// Timer Model
import Foundation
class TimerModel {
let label: String = "Counter"
var count: Int = 0
}
// Timer View Model
import Foundation
import SwiftUI
import Combine
class TimerViewModel: ObservableObject {
@Published var timerModel: TimerModel = TimerModel()
var label: String {
return self.timerModel.label
}
var count: Int {
return self.timerModel.count
}
func startTimer() {
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { (timer) in
DispatchQueue.main.async {
self.timerModel.count += 1
}
}
}
}
// Timer View
import SwiftUI
import Combine
struct TimerView: View {
@ObservedObject var timerViewModel: TimerViewModel
init() {
self.timerViewModel = TimerViewModel()
}
var body: some View {
VStack {
Text("\(self.timerViewModel.label): \(self.timerViewModel.count)")
Button(action: {
self.timerViewModel.startTimer()
}, label: {
Text("Start")
})
}
}
}
struct TimerView_Previews: PreviewProvider {
static var previews: some View {
TimerView()
}
}
// Content View
import SwiftUI
struct ContentView: View {
var body: some View {
TimerView()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Timer View Model 中 Timer Model 的 count 属性每秒钟改变一次,但 Timer View 不会重新渲染。感谢您提供实现 MVVM 模式的任何想法。
【问题讨论】: