我正在尝试调用子视图的方法,其中包括清除其某些字段。从父视图调用该方法时,什么也不会发生。但是,从子视图中调用该方法将清除其字段。这是一些示例代码:
isEmpty
有人可以告诉我为什么会发生这种情况以及如何解决/解决它吗?我无法直接访问子视图的get
,因为实际代码中的字段太多,这会使它过于混乱。
答案 0 :(得分:0)
尝试使用@Binding
代替@State
。绑定是一种将状态变化传达给孩子的方法。
这样考虑:@State
变量用于查看特定状态。因此,通常将它们制成private
。如果您需要传达任何信息,那么@Binding
是做到这一点的方法。
struct ChildView: View {
@Binding var response: String
var body: some View {
TextField("", text: $response)
}
}
struct ParentView: View {
@State private var response = ""
var body: some View {
HStack {
ChildView(response: $response)
Button(action: {
self.clear()
}) {
Text("Clear")
}
}
}
private func clear() {
self.response = ""
}
}
答案 1 :(得分:0)
SwiftUI视图不是引用类型,您不能创建一次,不能将其存储在var中,然后再访问它-SwiftUI视图是一种结构,值类型,因此像存储它一样使用它来存储值,即< / p>
struct ParentView: View {
private var child = ChildView() // << original value
var body: some View {
HStack {
self.child // created copy 1
Button(action: {
self.child.clear() // created copy 2
}) {
这是构造父/子视图的正确SwiftUI方法-有关子视图的所有信息都应在子视图内部或通过init
参数注入到其中:
struct ChildView: View {
@State private var response = ""
var body: some View {
HStack {
TextField("", text: $response)
Button(action: {
self.clear()
}) {
Text("Clear")
}
}
}
func clear() {
self.response = ""
}
}
struct ParentView: View {
var body: some View {
ChildView()
}
}