SwiftUI:函数内的按钮不更新视图
SwiftUI: Button inside function doesn't update view
在我看来,我正在尝试实现一个由函数 buttonView()
返回的按钮。该按钮显示布尔值是真、假还是零。该按钮从 nil 开始,每次单击按钮时在 true 和 false 之间切换,更新视图以显示 bool 的最新值。
问题: 显示布尔值的最新值的文本在单击时不会 change/update。
有趣的是,同一个按钮 works/updates 不放在函数中而是放在视图本身时完全没问题。
以下 SwiftUI 代码显示了我正在使用的代码。 (我在 macOS Monterey 上使用 XCode 13.2.1)
struct TestView: View {
var body: some View {
buttonView()
}
func buttonView() -> some View {
@State var testBool: Bool? // THE BOOL CHANGING/BEING SHOWN
return Button(action: {
testBool = Bool.random() // SETS BOOL VALUE ON CLICK
}, label: {
VStack {
Text("click me")
Text(testBool == nil ? "nil" : String(testBool!)) //DISPLAYS BOOL VALUE
}
})
}
}
您@State
在内部定义了一个成员函数。相反,它应该在您的 View
的顶层定义——这是它 retain/update 状态的唯一方式。最小的工作变化是:
struct TestView: View {
@State var testBool: Bool? //<-- Here
var body: some View {
buttonView()
}
func buttonView() -> some View {
Button(action: {
testBool = Bool.random()
}, label: {
VStack {
Text("click me")
Text(testBool == nil ? "nil" : String(testBool!))
}
})
}
}
进一步重构使其看起来 Swift-ier 可能是:
struct TestView: View {
@State var testBool: Bool?
var body: some View {
Button(action: {
testBool = Bool.random()
}) {
VStack {
Text("click me")
if let testBool = testBool {
Text(testBool ? "true" : "false")
} else {
Text("nil")
}
}
}
}
}
在我看来,我正在尝试实现一个由函数 buttonView()
返回的按钮。该按钮显示布尔值是真、假还是零。该按钮从 nil 开始,每次单击按钮时在 true 和 false 之间切换,更新视图以显示 bool 的最新值。
问题: 显示布尔值的最新值的文本在单击时不会 change/update。
有趣的是,同一个按钮 works/updates 不放在函数中而是放在视图本身时完全没问题。
以下 SwiftUI 代码显示了我正在使用的代码。 (我在 macOS Monterey 上使用 XCode 13.2.1)
struct TestView: View {
var body: some View {
buttonView()
}
func buttonView() -> some View {
@State var testBool: Bool? // THE BOOL CHANGING/BEING SHOWN
return Button(action: {
testBool = Bool.random() // SETS BOOL VALUE ON CLICK
}, label: {
VStack {
Text("click me")
Text(testBool == nil ? "nil" : String(testBool!)) //DISPLAYS BOOL VALUE
}
})
}
}
您@State
在内部定义了一个成员函数。相反,它应该在您的 View
的顶层定义——这是它 retain/update 状态的唯一方式。最小的工作变化是:
struct TestView: View {
@State var testBool: Bool? //<-- Here
var body: some View {
buttonView()
}
func buttonView() -> some View {
Button(action: {
testBool = Bool.random()
}, label: {
VStack {
Text("click me")
Text(testBool == nil ? "nil" : String(testBool!))
}
})
}
}
进一步重构使其看起来 Swift-ier 可能是:
struct TestView: View {
@State var testBool: Bool?
var body: some View {
Button(action: {
testBool = Bool.random()
}) {
VStack {
Text("click me")
if let testBool = testBool {
Text(testBool ? "true" : "false")
} else {
Text("nil")
}
}
}
}
}