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

如何为含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:35:20