如何为含FocusState.Binding类型变量的View2生成预览?
解决View2预览的FocusState绑定问题
要给View2的focused参数传值生成预览,你可以在预览结构体里创建一个临时的@FocusState变量,然后传递它的绑定。具体实现代码如下:
struct View2_Previews: PreviewProvider { @FocusState private static var previewFocusedField: View1.Field? static var previews: some View { View2( text: .constant("123456"), placeholder: "Password", focused: $previewFocusedField ) .padding() } }
补充优化建议
当前View2依赖View1的嵌套枚举Field,耦合性较高。你可以把Field枚举移到View1外部,变成独立的全局类型,这样View2和预览代码的引用都会更简洁:
// 独立的表单字段枚举 enum FormField { case username, password } struct View1: View { @State var passwordText: String = "" @FocusState var focusedField: FormField? var body: some View { View2(text: $passwordText, placeholder: "Password", focused: $focusedField) } } struct View2: View { @Binding var text: String let placeholder: String var focused: FocusState<FormField?>.Binding var body: some View { HStack { TextField(placeholder, text: $text) .frame(minHeight: 44) .padding(.leading, 8) .focused(focused, equals: .password) if text.count > 0 { Image(systemName: "xmark.circle.fill") .font(.headline) .foregroundColor(.secondary) .padding(.trailing, 8) } } } } // 简化后的预览代码 struct View2_Previews: PreviewProvider { @FocusState private static var previewFocusedField: FormField? static var previews: some View { View2( text: .constant("123456"), placeholder: "Password", focused: $previewFocusedField ) .padding() } }
这种调整不仅能让预览实现更顺畅,还能提升代码的可维护性。
内容的提问来源于stack exchange,提问作者erotsppa
相关产品推荐
相关产品推荐

