当值由单独的方法更改时,SwiftUI @状态不会触发更新。在SwiftUI中,@状态属性包装器用于声明一个可以在视图中使用的状态属性。当使用@状态属性包装器时,SwiftUI会自动监测属性的变化,并在属性发生变化时更新视图。然而,当属性是通过单独的方法进行更改时,@状态属性包装器无法自动检测到属性的变化,因此不会触发视图的更新。
要解决这个问题,可以使用@Binding属性包装器来传递状态属性的引用,并在方法中修改引用的值。这样,当值发生变化时,@Binding属性包装器会通知SwiftUI更新视图。
以下是一个示例代码:
struct ContentView: View {
@State private var count = 0
var body: some View {
VStack {
Text("Count: \(count)")
Button("Increment") {
incrementCount()
}
}
}
func incrementCount() {
count += 1
}
}
在上面的代码中,我们使用@State属性包装器声明了一个名为count的状态属性。在视图的body中,我们显示了count的值,并在按钮的动作中调用了incrementCount方法来增加count的值。由于我们直接修改了count的值,而不是通过@状态属性包装器,因此视图不会自动更新。
为了解决这个问题,我们可以将count属性改为@Binding类型,并将其传递给incrementCount方法。修改后的代码如下:
struct ContentView: View {
@State private var count = 0
var body: some View {
VStack {
Text("Count: \(count)")
Button("Increment") {
incrementCount(count: $count)
}
}
}
func incrementCount(count: Binding<Int>) {
count.wrappedValue += 1
}
}
在上面的代码中,我们将incrementCount方法的参数类型改为@Binding<Int>,并在调用方法时使用$count来传递count属性的引用。在方法中,我们使用count.wrappedValue来获取和修改count的值。这样,当count的值发生变化时,@Binding属性包装器会通知SwiftUI更新视图。
这是一个解决当值由单独的方法更改时,@状态不触发更新的方法。希望对你有帮助!
领取专属 10元无门槛券
手把手带您无忧上云