我正在尋找適當的模式和語法來解決我的目標,即擁有一個可以在多個視圖之間共享的 ObservableObject 實體,但同時保持與之關聯的邏輯包含在另一個類中。我希望這樣做是為了允許不同的“控制器”類來操縱狀態的屬性,而視圖不需要知道哪個控制器正在作用于它(注入)。
這是說明問題的簡化:
import SwiftUI
class State: ObservableObject {
@Published var text = "foo"
}
class Controller {
var state : State
init(_ state: State) {
self.state = state
}
func changeState() {
state.text = "bar"
}
}
struct ContentView: View {
@StateObject var state = State()
var controller: Controller!
init() {
controller = Controller(state)
}
var body: some View {
VStack {
Text(controller.state.text) // always shows 'foo'
Button("Press Me") {
print(controller.state.text) // prints 'foo'
controller.changeState()
print(controller.state.text) // prints 'bar'
}
}
}
}
我知道我可以直接使用我的 ObservableObject 并操縱它的屬性,以便更新 UI 作為回應,但在我的情況下,這樣做會阻止我根據需要發生的情況而擁有不同的“控制器”實體。請告知在 SwiftUI 中完成此類場景的最佳方法
uj5u.com熱心網友回復:
為了讓 SwiftUI 視圖跟隨狀態更新,你的控制器需要是ObservableObject.
SwiftUI 視圖將在objectWillChange被觸發時更新 - 對于帶有 注釋的屬性,它會自動完成Published,但您也可以手動觸發它。
使用與您的狀態相同的發布者,您可以同步兩個可觀察物件,例如:
class Controller: ObservableObject {
let state: State
private var cancellable: AnyCancellable?
init(_ state: State) {
self.state = state
cancellable = state.objectWillChange.sink {
self.objectWillChange.send()
}
}
func changeState() {
state.text = "bar"
}
}
struct ContentView: View {
@StateObject var controller = Controller(State())
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/448437.html
