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

SwiftUI预览中如何为FocusState.Binding传递值?

解决SwiftUI预览中传递FocusState.Binding的问题

问题说明

我知道可以通过FocusState.Binding向@FocusState传递绑定值,实际运行时正常生效,但不知道怎么在SwiftUI预览中给它传值。尝试用.constant时出现错误:Type 'FocusState<Bool>.Binding' has no member 'constant',相关代码如下:

struct ContentView: View {
    @Binding var text: String
    var focused: FocusState<Bool>.Binding
    var body: some View {
        TextField("", text: $text)
            .focused(focused)
    }
}

// Error: Type 'FocusState<Bool>.Binding' has no member 'constant'
#Preview {
    ContentView(text: .constant("Hello World"), focused: .constant(true))
}

解决方案

FocusState.Binding不能像普通Binding那样直接用.constant创建,需要从一个@FocusState变量的投影获取。你可以在预览的容器视图中声明临时的@FocusState属性,再把它的绑定传递给ContentView:

#Preview {
    struct PreviewWrapper: View {
        @FocusState private var isFocused: Bool
        
        var body: some View {
            ContentView(text: .constant("Hello World"), focused: $isFocused)
                .onAppear {
                    // 如需预览时默认聚焦,添加此代码
                    isFocused = true
                }
        }
    }
    
    PreviewWrapper()
}

原理说明

  • FocusState.Binding是SwiftUI专为焦点管理设计的绑定类型,和普通Binding不属于同一类型,因此不支持.constant构造方法。
  • 通过在预览容器中创建@FocusState变量,利用其$投影得到符合要求的FocusState<Bool>.Binding,既能正常传递给子视图,还能通过修改该变量控制预览中的焦点状态。

内容的提问来源于stack exchange,提问作者Berry Blue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:14:58