Уведомление об изменении наблюдаемого объекта как вложенного объекта в SwiftUI - PullRequest
0 голосов
/ 04 августа 2020

У меня есть следующий сценарий.

У меня есть AppState, который состоит из объекта типа Foo. В Foo есть переменная счетчика, и я хочу вызвать objectWillChange при обновлении значения счетчика, чтобы я мог обновить пользовательский интерфейс.

В настоящее время ничего не происходит. Функция приращения вызывается, но пользовательский интерфейс никогда не обновляется.




import Foundation
import Combine

class Foo: ObservableObject {
    @Published var counter: Int = 999
    
    func increment() {
        counter += 1 // how to get notified when counter value changes
    }
}

class AppState: ObservableObject {
    
    @Published var foo: Foo = Foo()
}

// usage in Scene Delegate as Environment Object
let appState = AppState()

// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
    let window = UIWindow(windowScene: windowScene)
    window.rootViewController = UIHostingController(rootView: accountSummaryScreen.environmentObject(appState))

UPDATE

class Foo: ObservableObject {
    @Published var counter: Int = 999 {
        didSet {
            objectWillChange.send() 
        }
    }
    
    func increment() {
        counter += 1 // how to get notified when counter value changes
    }
}

1 Ответ

1 голос
/ 04 августа 2020

Изменения не обнаруживаются, потому что Foo, являясь ссылочным типом, на самом деле не меняется - это та же ссылка, поэтому @Published здесь не помогает.

AppState будет нужно вручную подписаться на изменения и называть свои objectWillChange.send:

class AppState: ObservableObject {
    
    var foo: Foo = Foo() {
       didSet {
          cancellables = []
          foo.$counter
             .map { _ in } // ignore actual values
             .sink(receiveValue: self.objectWillChange.send)
             .store(in: &cancellables)
       }
    }

    private var cancellables: Set<AnyCancellable> = []
}
...