我尝试了多种方法来更新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"
}
}
@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"
}
}
2. @State从可变函数(mutating function)中更改
@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)
}
当调用
somePublishSubject
并改变bodyText
状态时,视图不会更新。SwiftUI 的文档不是很多,这使得理解为什么视图更新和
@State
更改变得更加混乱。对于这种行为的任何解释都将非常有帮助。
_bodyText = State(initialValue: "Hello Swift !")
这样初始化bodyText
,它就可以工作了。 - G.Abhisek