SwiftUI วิธีสร้างอินสแตนซ์ PreviewProvider เมื่อ View ต้องการ @Binding ใน initializer


10

ด้วย SwiftUI (Xcode 11.1) ฉันได้ตั้งค่า Views บางส่วนด้วยการผูกสองทาง (โดยใช้@ ผูก ) การอัปเดตสองทางใช้งานได้ดี

อย่างไรก็ตามฉันจะสร้างอินสแตนซ์ของมุมมองจาก PreviewProvider ได้อย่างไร

ตัวอย่างเช่น:

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

และฉันไม่สามารถทำเช่นนี้ได้เพราะ " คุณสมบัติตัวห่อทรัพย์สินยังไม่รองรับคุณสมบัติท้องถิ่น ":

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

เราจะทำเช่นนี้ได้อย่างไร?

ขอบคุณ !!

คำตอบ:


15

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

ที่สมบูรณ์แบบ! - สุดยอด!
drewster

5

คุณต้องประกาศว่าเป็น @ State ในหน้าตัวอย่างของคุณ

struct AddProjectView_Previews: PreviewProvider {

     @State static var showModal: Bool = false

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

โปรดจำไว้ด้วยว่าจะต้องมีการคงที่เนื่องจากจะใช้ในฟังก์ชั่นคงที่


1
พฤติกรรมใน XCode 11.3 นั้นเหมือนกับการใช้อย่างมีประสิทธิภาพ.constant(false)เช่นถ้าคุณใช้การแสดงตัวอย่างแบบสดค่าจะไม่สามารถเปลี่ยนแปลงได้
Fabian Streitel

4

หากคุณต้องการเพียงค่าคงที่ให้ใช้.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)
        }
    }

}

สิ่งนี้อนุญาตให้คุณทดสอบการเปลี่ยนแปลงการโยงในตัวอย่างสด


คุณไม่มีความคิดเลยว่าคำตอบของคุณช่วยให้ฉันสร้างโค้ดที่ดีขึ้นได้อย่างไร ขอบคุณหนึ่งล้าน ฉันยังคงเรียนรู้ SWIFTUI และ BindingProvider ที่คุณเขียนอยู่นอกเหนือความรู้ที่ จำกัด ของฉัน ฉันเข้าใจแล้วว่า แต่ไม่เข้าใจ 100% ขอบคุณอยู่ดี
GrandSteph

ดีใจที่ได้ช่วยเหลือ! ติดตามและเรียนรู้ต่อไป: D
Fabian Streitel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.