[英]How to get variable value of child view in parent view on SwiftUI?
我有一个视图“CancelRow”
struct CancelRow: View {
@Binding var isSelected: Bool
init(isSelected: Binding<Bool>) {
self._isSelected = isSelected //just to get bool value
}
@ViewBuilder var body: some View {
HStack {
Text(verbatim: "Hello, \(isSelected)")
}
}
我有另一个视图,我想根据“CancelRow”中的“isSelected”显示按钮是否处于活动状态
// 另一个视图
CancelRow(isSelected: .constant(false))
Spacer()
SubmitButtonView(buttonTitle: title, buttonCallBack: {
goToOtherScreen()
}, isActive: isSelected ) // how to access this variable from "CancelRow"
如评论中所述, state 应由父视图拥有,然后传递给子视图。
在您的情况下,您实际上不需要在您提供的示例中为CancelRow
使用自定义初始化程序(您可以仅依赖合成的初始化程序),但作为请求,这使用了初始化程序。
struct CancelRow: View {
@Binding var isSelected: Bool
init(isSelected: Binding<Bool>) {
self._isSelected = isSelected
}
@ViewBuilder var body: some View {
HStack {
Text(verbatim: "Hello, \(isSelected)")
}
}
}
struct SubmitButtonView : View {
var buttonTitle : String
var buttonCallBack : () -> Void
var isActive : Bool
var body: some View {
Text("Submit: \(isActive ? "true" : "false")")
}
}
struct ContentView: View {
@State private var isSelected = false
var title : String {
"Title"
}
var body: some View {
VStack {
Button("Toggle") {
isSelected.toggle()
}
CancelRow(isSelected: $isSelected)
SubmitButtonView(buttonTitle: title, buttonCallBack: {
goToOtherScreen()
}, isActive: isSelected )
}
}
func goToOtherScreen() {
print("Navigate")
}
}
有这个Source of truth
概念。 简而言之,您需要在其中一个结构中拥有一个@State private var
。 如果该@State private var
包含其他结构想要使用的任何信息,则第二个结构应该具有@Binding var
并使用@State private var
的值从第一个结构初始化。
在下面的代码中, struct AnotherView
是事实的来源,它具有@State private var
,而其他结构具有@Binding
并使用该@State private var
的值进行初始化。
结构另一个视图:
@State private var isSelected = false var body: some View { VStack { CancelRow(isSelected: $isSelected) Spacer() SubmitButtonView(isSelected: $isSelected) } }
结构取消行:
@Binding var isSelected: Bool var body: some View { Text(isSelected? "I'm selected": "I'm not selected") }
结构提交按钮视图:
@Binding var isSelected: Bool var body: some View { Button { // do something on tap } label: { Text("Button text") } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.