Swift开发:如何传递FocusState变量到其他视图并允许其更新该变量
错误根因
你的代码存在两处核心问题:
ViewB中错误使用@State修饰接收绑定值的属性:@State仅用于管理视图自身的私有状态,接收父视图传递的绑定值应使用@Binding,或直接声明为对应绑定类型不加属性包装器- 赋值语法不匹配:直接对
FocusState<Bool>.Binding类型变量赋值时,操作的是绑定对象本身而非其包裹的Bool值,触发类型不匹配报错
解决方案
提供两种可直接落地的实现方案,按需选择即可:
方案1:使用@Binding接收(推荐,通用性更强)
该方案让ViewB无需感知上层状态是否为FocusState,可同时兼容普通@State和FocusState的绑定传参,代码更简洁:
struct ViewA: View { @FocusState private var focusedField: Bool var body: some View { ViewB(focusedField: $focusedField) // 其他读取focusedField的视图... } } struct ViewB: View { // 直接用@Binding声明Bool类型即可 @Binding var focusedField: Bool var body: some View { Button(action: { focusedField = true // 直接赋值无报错 }) { Text("激活焦点") } // 其余视图逻辑 } }
方案2:保留FocusState.Binding类型
如果你的ViewB需要用到FocusState绑定的专属特性,可以保留原类型,只做两处修改:
- 移除属性前的
@State修饰符 - 赋值时访问
wrappedValue属性
struct ViewB: View { // 去掉@State,直接声明为FocusState.Binding类型 var focusedField: FocusState<Bool>.Binding var body: some View { Button(action: { // 通过wrappedValue访问包裹的Bool值进行赋值 focusedField.wrappedValue = true }) { Text("激活焦点") } // 其余视图逻辑 } }
内容的提问来源于stack exchange,提问作者PipEvangelist
相关产品推荐
相关产品推荐

