Как реализовать MVVM-шаблон в SwiftUI? Представление не перерисовывается - PullRequest
0 голосов
/ 06 января 2020

Я изучаю SwiftUI и пытаюсь реализовать простой таймер с MVVM-шаблоном. Но точка зрения Таймера не перерисовывается. В чем проблема?

// 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()
    }
}

Свойство count модели таймера в модели представления таймера изменяется каждую секунду, но представление таймера не отображается повторно. Спасибо за любую идею для реализации MVVM-шаблона.

1 Ответ

1 голос
/ 06 января 2020

Самое простое - изменить модель на тип значения

struct TimerModel {
    let label: String = "Counter"
    var count: Int = 0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...