Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从父视图SwiftUI访问子视图中的@State变量_Swift_Swiftui - Fatal编程技术网

从父视图SwiftUI访问子视图中的@State变量

从父视图SwiftUI访问子视图中的@State变量,swift,swiftui,Swift,Swiftui,我试图从调用该视图的视图访问视图中标记为@State的变量。子视图中的这些变量连接到文本框。如果我在该文本框中键入并点击return,然后单击一个按钮,则该按钮位于父视图中,要读取该变量,它将返回一个空字符串。如果我把这个按钮放在子视图中,做同样的事情,它会打印我在文本框中输入的内容。我对SwiftUI非常陌生,这可能是一个非常简单的修复方法,但我已经尝试了一切。非常感谢您的帮助 父视图(DetailedView) 您可以将子视图属性声明为@Binding,而不是@State: struct D

我试图从调用该视图的视图访问视图中标记为@State的变量。子视图中的这些变量连接到文本框。如果我在该文本框中键入并点击return,然后单击一个按钮,则该按钮位于父视图中,要读取该变量,它将返回一个空字符串。如果我把这个按钮放在子视图中,做同样的事情,它会打印我在文本框中输入的内容。我对SwiftUI非常陌生,这可能是一个非常简单的修复方法,但我已经尝试了一切。非常感谢您的帮助

父视图(DetailedView)


您可以将子视图属性声明为
@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)
不要忘记
状态
变量名之前的前导
$
,以便将其作为
绑定传递