SwiftUI如何在View需要初始化器中的@Binding时实例化PreviewProvider

使用SwiftUI(Xcode 11.1),我已经设置了一些使用2向绑定的视图(使用 @Binding )。双向更新效果很好。

但是,如何从PreviewProvider实例化视图?

例如:

struct AddProjectView: View {

    @Binding public var showModal: Bool

    var body: some View {

        return VStack {
            Text("Add Project View")
            Button("Dismiss") {
                self.showModal = false
            }
        }
    }
}

我不能这样做,因为“ true”不是绑定:

struct AddProjectView_Previews: PreviewProvider {
    static var previews: some View {
        AddProjectView(showModal: true)
    }
}

我不能这样做,因为“ 本地属性尚不支持属性包装器”:

struct AddProjectView_Previews: PreviewProvider {
    static var previews: some View {
        @Binding var show = true
        return AddProjectView(showModal: $show)
    }
}

我们如何做到这一点?

谢谢!

cc4400092 回答:SwiftUI如何在View需要初始化器中的@Binding时实例化PreviewProvider

.constant就是为了这个目的

  

////创建具有不变的value的绑定。

struct AddProjectView: View {
    @Binding public var showModal: Bool
    var body: some View {
        return VStack {
            Text("Add Project View")
            Button("Dismiss") {
                self.showModal = false
            }
        }
    }
}

struct AddProjectView_Previews: PreviewProvider {
    static var previews: some View {
        AddProjectView(showModal: .constant(true))
    }
}
,

您必须在预览中将其声明为@State。

struct AddProjectView_Previews: PreviewProvider {

     @State static var showModal: Bool = false

     static var previews: some View {
         AddProjectView(showModal: $showModal)
     }
}

还要记住,它必须是静态的,因为它在静态函数中使用。

,

如果您只需要一个恒定值,请使用.constant(VALUE)

struct YourView_Previews: PreviewProvider {

    static var previews: some View {
        YourView(yourBindingVar: .constant(true))
    }

}

如果您需要一个可以在实时预览中更改的值,我喜欢使用此帮助程序类:

struct BindingProvider<StateT,Content: View>: View {

    @State private var state: StateT
    private var content: (_ binding: Binding<StateT>) -> Content

    init(_ initialState: StateT,@ViewBuilder content: @escaping (_ binding: Binding<StateT>) -> Content) {
        self.content = content
        self._state = State(initialValue: initialState)
    }

    var body: some View {
        self.content($state)
    }
}

像这样使用它:

struct YourView_Previews: PreviewProvider {

    static var previews: some View {
        BindingProvider(false) { binding in
            YourView(yourBindingVar: binding)
        }
    }

}

这使您可以测试更改实时预览中的绑定。

本文链接:https://www.f2er.com/3163400.html

大家都在问