使用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)
}
}
我们如何做到这一点?
谢谢!
答案 0 :(得分:6)
.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))
}
}
答案 1 :(得分:2)
您必须在预览中将其声明为@State。
struct AddProjectView_Previews: PreviewProvider {
@State static var showModal: Bool = false
static var previews: some View {
AddProjectView(showModal: $showModal)
}
}
还要记住,它必须是静态的,因为它在静态函数中使用。
答案 2 :(得分:0)
如果您只需要一个恒定值,请使用.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)
}
}
}
这使您可以测试更改实时预览中的绑定。