繁体   English   中英

如何在 SwiftUI 的父视图中获取子视图的变量值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM