在变异函数和初始化程序中更改时 @State 不更新 SwiftUI 视图

G.A*_*sek 7 ios swift swiftui

我尝试了在 SwiftUI 视图中更新 @State 的不同方法。在某些方法中,状态更改会更新相关视图,而在某些方法中则不会。

@State更改更新视图

@State var bodyText: String = "Hello swift"

var body: some View {
    Text(bodyText)
        .onAppear(perform: triggerTextUpdate)
}

private func triggerTextUpdate() {
    DispatchQueue.main.asyncAfter(deadline: .now()+3) {
        bodyText = "Hello I am future swift"
    }
}
Run Code Online (Sandbox Code Playgroud)

@State 更改不更新视图

1.@State从初始化器改变

@State var bodyText: String = "Hello swift"
init() {
    triggerTextUpdate()
}

var body: some View {
    Text(bodyText)
}

private func triggerTextUpdate() {
    DispatchQueue.main.asyncAfter(deadline: .now()+3) {
        bodyText = "Hello I am future swift"
    }
}
Run Code Online (Sandbox Code Playgroud)

2.@State由变异函数改变

@State var bodyText: String = "Hello swift"
private let somePublishSubject = PublishSubject<String, Never>()
private var subscriptions = Set<AnyCancellable>()

init() {
    setUpBinding()
}

var body: some View {
    Text(bodyText)
}

mutating func setUpBinding() {
    somePublishSubject.sink { [self] text in
        self.bodyText = text
    }.store(in: &subscriptions)
}
Run Code Online (Sandbox Code Playgroud)

somePublishSubject调用并更改bodyText状态时,视图不会更新。

关于 SwiftUI 的文档并不多,这使得理解为什么视图更新和@State更改变得更加混乱。对这种行为的任何解释都会非常有帮助。

JIE*_*ANG 6

医生得很清楚。

\n
\n

您应该只从 view\xe2\x80\x99s 主体内部或从它调用的方法访问状态属性。因此,请将您的状态属性声明为私有,以防止您的视图的客户端访问它们。从任何线程改变状态属性都是安全的。

\n
\n

这意味着您不允许更改您的状态init,或者somePublishSubject.sink

\n