Почему мой текстовый вид SwiftUI не обновляется при изменении viewModel с помощью Combine? - PullRequest
4 голосов
/ 04 октября 2019

Я создаю новое приложение watchOS с использованием SwiftUI и Combine, пытаясь использовать архитектуру MVVM, но когда моя viewModel изменяется, я не могу получить текстовое представление для обновления в моем View.

Я использую watchOS 6, SwiftUI и Combine. Я использую @ObservedObject и @Published, когда считаю, что их следует использовать, но изменения не отражаются так, как я ожидал.

// Simple ContentView that will push the next view on the navigation stack
struct ContentView: View {
    var body: some View {
        NavigationLink(destination: NewView()) {
            Text("Click Here")
        }
    }
}

struct NewView: View {
    @ObservedObject var viewModel: ViewModel

    init() {
        viewModel = ViewModel()
    }

    var body: some View {
        // This value never updates
        Text(viewModel.str)
    }
}

class ViewModel: NSObject, ObservableObject {
    @Published var str = ""
    var count = 0

    override init() {
        super.init()

        // Just something that will cause a property to update in the viewModel
        Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in
            self?.count += 1
            self?.str = "\(String(describing: self?.count))"

            print("Updated count: \(String(describing: self?.count))")
        }
    }
}

Text(viewModel.str) никогда не обновляется, даже если viewModel увеличивает новыйзначение когда-либо 1,0 с. Я пытался objectWillChange.send(), когда свойство обновляется, но ничего не работает.

Я что-то делаю не так?

1 Ответ

2 голосов
/ 04 октября 2019

В настоящее время есть решение, которое я, к счастью, нашел, просто экспериментируя. Мне еще предстоит выяснить, что именно является причиной этого. До этого вы просто не наследуете от NSObject, и все должно работать нормально.

class ViewModel: ObservableObject {
    @Published var str = ""
    var count = 0

    init() {

        // Just something that will cause a property to update in the viewModel
        Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in
            self?.count += 1
            self?.str = "\(String(describing: self?.count))"

            print("Updated count: \(String(describing: self?.count))")
        }
    }
}

Я проверял это, и оно работает.


Аналогичный вопрос также решает эту проблему, поскольку объект издателя является подклассом NSObject. Так что вам может понадобиться переосмыслить, если вам действительно нужен подкласс NSObject или нет. Если вы не можете уйти от NSObject, я рекомендую вам попробовать одно из решений из связанного вопроса.

...