SwiftUI How to instantiate PreviewProvider when View requires @Binding in initializer

前端 未结 3 504
春和景丽
春和景丽 2021-01-07 23:17

With SwiftUI (Xcode 11.1), I\'ve got some Views set up with 2-way bindings (using @Binding). Two-way updating works great.

However, how can I insta

相关标签:
3条回答
  • 2021-01-07 23:35

    .constant is meant exactly for that:

    /// Creates a binding with an immutable 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))
        }
    }
    
    0 讨论(0)
  • 2021-01-07 23:39

    You have to declare it as @State on your Preview.

    struct AddProjectView_Previews: PreviewProvider {
    
         @State static var showModal: Bool = false
    
         static var previews: some View {
             AddProjectView(showModal: $showModal)
         }
    }
    

    Also remeber that it needs to be static as it is used in a static func.

    0 讨论(0)
  • 2021-01-07 23:45

    If you only need a constant value, use .constant(VALUE):

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

    If you need a value that can be changed in the live preview, I like to use this helper class:

    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)
        }
    }
    

    Use it like so:

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

    This allows you to test changing the binding in the live preview.

    0 讨论(0)
提交回复
热议问题