从父视图SwiftUI访问子视图中的@State变量
我试图从调用该视图的视图访问视图中标记为@State的变量。子视图中的这些变量连接到文本框。如果我在该文本框中键入并点击return,然后单击一个按钮,则该按钮位于父视图中,要读取该变量,它将返回一个空字符串。如果我把这个按钮放在子视图中,做同样的事情,它会打印我在文本框中输入的内容。我对SwiftUI非常陌生,这可能是一个非常简单的修复方法,但我已经尝试了一切。非常感谢您的帮助 父视图(DetailedView)从父视图SwiftUI访问子视图中的@State变量,swift,swiftui,Swift,Swiftui,我试图从调用该视图的视图访问视图中标记为@State的变量。子视图中的这些变量连接到文本框。如果我在该文本框中键入并点击return,然后单击一个按钮,则该按钮位于父视图中,要读取该变量,它将返回一个空字符串。如果我把这个按钮放在子视图中,做同样的事情,它会打印我在文本框中输入的内容。我对SwiftUI非常陌生,这可能是一个非常简单的修复方法,但我已经尝试了一切。非常感谢您的帮助 父视图(DetailedView) 您可以将子视图属性声明为@Binding,而不是@State: struct D
您可以将子视图属性声明为
@Binding
,而不是@State
:
struct DetailedView: View {
...
@State public var exercise: String = "Bench Press"
}
struct ExerciseCard: View {
@Binding public var exercise: String
...
}
然后将变量从父视图传递到子视图:
ExerciseCard(exercise: $exercise)
struct ExerciseCard: View {
@Binding public var exercise : String
@Binding public var tableRows : [ExerciseTableRow]
//
}
您可以将子视图属性声明为
@Binding
,而不是@State
:
struct DetailedView: View {
...
@State public var exercise: String = "Bench Press"
}
struct ExerciseCard: View {
@Binding public var exercise: String
...
}
然后将变量从父视图传递到子视图:
ExerciseCard(exercise: $exercise)
struct ExerciseCard: View {
@Binding public var exercise : String
@Binding public var tableRows : [ExerciseTableRow]
//
}
详细视图中的状态
与练习表行中的状态
不相关。他们只是碰巧有相同的名字,但他们是不同的
要在子视图中访问这些变量,必须将这些值传递给子视图
您可以将它们存储在常量中:
struct ExerciseCard: View {
let exercise : String
let tableRows : [ExerciseTableRow]
//
}
并通过传递值初始化视图:
ExerciseCard(exercise: someString, tableRows: someArray)
如果希望能够在子视图中更改这些值,则应在子视图中将它们定义为Binding
s:
ExerciseCard(exercise: $exercise)
struct ExerciseCard: View {
@Binding public var exercise : String
@Binding public var tableRows : [ExerciseTableRow]
//
}
并对其进行初始化:
ExerciseCard(exercise: self.$exerciseString, tableRows: self.$tableRowsArray)
不要忘记在状态
变量名之前的前导$
,将其作为绑定
传递详细视图
中的状态
与练习表行
中的状态不相关。他们只是碰巧有相同的名字,但他们是不同的
要在子视图中访问这些变量,必须将这些值传递给子视图
您可以将它们存储在常量中:
struct ExerciseCard: View {
let exercise : String
let tableRows : [ExerciseTableRow]
//
}
并通过传递值初始化视图:
ExerciseCard(exercise: someString, tableRows: someArray)
如果希望能够在子视图中更改这些值,则应在子视图中将它们定义为Binding
s:
ExerciseCard(exercise: $exercise)
struct ExerciseCard: View {
@Binding public var exercise : String
@Binding public var tableRows : [ExerciseTableRow]
//
}
并对其进行初始化:
ExerciseCard(exercise: self.$exerciseString, tableRows: self.$tableRowsArray)
不要忘记状态
变量名之前的前导$
,以便将其作为绑定传递