SwiftUI Cách khởi tạo PreviewProvider khi View yêu cầu @Binding trong trình khởi tạo


10

Với SwiftUI (Xcode 11.1), tôi đã có một số Chế độ xem được thiết lập với các ràng buộc 2 chiều (sử dụng @Binding ). Cập nhật hai chiều hoạt động tuyệt vời.

Tuy nhiên, làm cách nào tôi có thể khởi tạo chế độ xem từ PreviewProvider?

Ví dụ:

struct AddProjectView: View {

    @Binding public var showModal: Bool

    var body: some View {

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

Tôi không thể làm điều này, bởi vì "true" không phải là Binding:

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

Và tôi không thể làm điều này vì "Trình bao bọc thuộc tính chưa được hỗ trợ trên các thuộc tính cục bộ ":

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

Chung ta se lam như thê nao?

Cảm ơn!!

Câu trả lời:


15

.constant có nghĩa là chính xác cho điều đó:

/// Tạo một ràng buộc với một bất biến 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))
    }
}

Hoàn hảo! -- Tuyệt vời!
vẽ

5

Bạn phải khai báo nó là @State trên Bản xem trước của bạn.

struct AddProjectView_Previews: PreviewProvider {

     @State static var showModal: Bool = false

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

Ngoài ra, hãy nhớ rằng nó cần phải tĩnh vì nó được sử dụng trong func tĩnh.


1
Hành vi trong XCode 11.3 thực sự giống như sử dụng .constant(false), tức là nếu bạn sử dụng bản xem trước trực tiếp, giá trị không thể thay đổi.
Fabian Streitel

4

Nếu bạn chỉ cần một giá trị không đổi , hãy sử dụng .constant(VALUE):

struct YourView_Previews: PreviewProvider {

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

}

Nếu bạn cần một giá trị có thể thay đổi trong bản xem trước trực tiếp , tôi muốn sử dụng lớp trình trợ giúp này:

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

Sử dụng nó như vậy:

struct YourView_Previews: PreviewProvider {

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

}

Điều này cho phép bạn kiểm tra thay đổi liên kết trong bản xem trước trực tiếp.


Bạn không biết làm thế nào câu trả lời của bạn đã giúp tôi tạo ra mã tốt hơn. Cảm ơn rất nhiều. Tôi vẫn đang học SWiftUI và BindingProvider mà bạn đã viết vượt quá kiến ​​thức nhanh chóng hạn chế của tôi. Tôi có cảm giác nếu nhưng không hiểu 100%. Dù sao cũng cảm ơn bạn.
GrandSteph

Rất vui được giúp đỡ! Hãy tiếp tục và tiếp tục học hỏi: D
Fabian Streitel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.