О сохранении привязки в объекте Observable в SwiftUI ⇐ IOS
-
Anonymous
О сохранении привязки в объекте Observable в SwiftUI
Я создаю приложение для Mac. При многократном запуске все окна должны иметь доступ к одному и тому же состоянию приложения (theAppState), но каждое окно должно отображать свои собственные данные (типа MyClass). >).
Как показано ниже, когда MainWindow создает объект MyClass, он передает привязку к theAppState.
В MainWindow есть кнопка, которая вызывает obj.incBoth(). В результате AppState увеличивается (как и должно быть).
Тело отображает theAppState разными способами:
[*]self.appState отображается правильно и увеличивается при каждом нажатии кнопки. [*]obj.appstate не отображается правильно (всегда отображается исходное значение 42) [*]obj.appstate() не отображается правильно (так же, как obj.appstate)
Пожалуйста, помогите мне понять это странное поведение!
Обновление: Обратите внимание, что и представление, и объект MyClass (obj) могут получать доступ к theAppState через свои локальные привязки. В представлении self.appState возвращает правильное значение, а объект распечатывает правильное значение в incBoth(). Что мне кажется странным, так это то, что представление не может получить доступ к AppState косвенно через obj.appstate2(). Ваши комментарии предполагают, что не следует использовать привязку в StateObject. Возможно, это и правильно, но это объясняет странное поведение.
импортировать SwiftUI класс MyClass: ObservableObject { @Published вар x = 0 @Binding var appstate: Int init(appstate: Binding){ self._appstate = состояние приложения } func appstate2() -> Int { вернуть self.appstate } функция IncBoth() { х+=1 состояние приложения += 1 print("x=\(x) appstate=\(appstate)") } } структура MainView: Просмотр { @Binding var appState: Int @StateObject var obj: MyClass init(appstate: Binding){ self._appState = состояние приложения self._obj = StateObject(wrappedValue: MyClass(appstate: appstate)) } var body: some View { Text("appState = \(appState), obj.appstate = \(obj.appstate), obj.appstate2 = \(obj.appstate2()) obj.x = \(obj.x)") Кнопка("Вкл") { obj.incBoth() } } } @основной структура ПроблемаПриложение: Приложение { @State Private var theAppState = 42 var body: некоторая сцена { ОкноГруппа { MainView (состояние приложения: $theAppState) } } }
Я создаю приложение для Mac. При многократном запуске все окна должны иметь доступ к одному и тому же состоянию приложения (theAppState), но каждое окно должно отображать свои собственные данные (типа MyClass). >).
Как показано ниже, когда MainWindow создает объект MyClass, он передает привязку к theAppState.
В MainWindow есть кнопка, которая вызывает obj.incBoth(). В результате AppState увеличивается (как и должно быть).
Тело отображает theAppState разными способами:
[*]self.appState отображается правильно и увеличивается при каждом нажатии кнопки. [*]obj.appstate не отображается правильно (всегда отображается исходное значение 42) [*]obj.appstate() не отображается правильно (так же, как obj.appstate)
Пожалуйста, помогите мне понять это странное поведение!
Обновление: Обратите внимание, что и представление, и объект MyClass (obj) могут получать доступ к theAppState через свои локальные привязки. В представлении self.appState возвращает правильное значение, а объект распечатывает правильное значение в incBoth(). Что мне кажется странным, так это то, что представление не может получить доступ к AppState косвенно через obj.appstate2(). Ваши комментарии предполагают, что не следует использовать привязку в StateObject. Возможно, это и правильно, но это объясняет странное поведение.
импортировать SwiftUI класс MyClass: ObservableObject { @Published вар x = 0 @Binding var appstate: Int init(appstate: Binding){ self._appstate = состояние приложения } func appstate2() -> Int { вернуть self.appstate } функция IncBoth() { х+=1 состояние приложения += 1 print("x=\(x) appstate=\(appstate)") } } структура MainView: Просмотр { @Binding var appState: Int @StateObject var obj: MyClass init(appstate: Binding){ self._appState = состояние приложения self._obj = StateObject(wrappedValue: MyClass(appstate: appstate)) } var body: some View { Text("appState = \(appState), obj.appstate = \(obj.appstate), obj.appstate2 = \(obj.appstate2()) obj.x = \(obj.x)") Кнопка("Вкл") { obj.incBoth() } } } @основной структура ПроблемаПриложение: Приложение { @State Private var theAppState = 42 var body: некоторая сцена { ОкноГруппа { MainView (состояние приложения: $theAppState) } } }
Мобильная версия