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
相关产品推荐
相关产品推荐

