You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

解决从CancelRow获取isSelected状态的问题

这个问题的核心是你没有在父视图(AnotherView)和子视图(CancelRow)之间建立可双向绑定的状态,你现在用的.constant(false)是一个不可变的绑定,所以CancelRow里的isSelected.toggle()根本不会影响到父视图的状态。咱们来一步步解决:

步骤1:在父视图(AnotherView)中声明共享状态

在AnotherView里添加一个@State变量来管理选中状态,这个状态会在CancelRow和SubmitButtonView之间共享:

struct AnotherView: View {
    // 声明一个@State变量管理选中状态,初始值设为false
    @State private var isCancelRowSelected = false
    var title: String // 假设你已定义该变量
    
    var body: some View {
        VStack {
            // 步骤2:把@State变量以Binding形式传给CancelRow
            CancelRow(isSelected: $isCancelRowSelected)
            Spacer()
            // 步骤3:将同一个变量传给SubmitButtonView控制按钮状态
            SubmitButtonView(
                buttonTitle: title,
                buttonCallBack: { goToOtherScreen() },
                isActive: isCancelRowSelected
            )
        }
    }
    
    private func goToOtherScreen() {
        // 你的跳转逻辑实现
    }
}

步骤2:确认CancelRow的Binding逻辑

你的CancelRow代码已经正确使用了@Binding,不需要修改,只是注意代码里的$canCancel看起来是个未定义的笔误,建议修正或移除:

struct CancelRow: View {
    @Binding var isSelected: Bool
    
    init(isSelected: Binding<Bool>) {
        self._isSelected = isSelected
    }
    
    @ViewBuilder var body: some View {
        HStack {
            Text(verbatim: "Hello, \(isSelected)")
        }
        // 注意:这里的$canCancel未定义,请根据实际需求修正
        CustomCheckbox(checkboxType: .withTrailingLabel, checkboxTitle: "", isActive: $canCancel, isSelected: $isSelected)
    }
    .onTapGesture {
        isSelected.toggle()
    }
}

原理说明

  • @State变量负责在父视图内部存储状态值
  • 通过$符号把@State转换成Binding传给子视图(CancelRow),子视图对isSelected的修改会实时同步回父视图
  • 父视图直接将这个状态值传给SubmitButtonView,就能实时控制按钮的可用状态了

内容的提问来源于stack exchange,提问作者New iOS Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:50:20