SwiftUI Görünüm başlatırken @ Bağlama gerektirdiğinde PreviewProvider nasıl başlatılır


10

SwiftUI (Xcode 11.1) ile, 2 yönlü bağlamalar ( @Binding kullanarak ) ile ayarlanmış bazı Views'um var . İki yönlü güncelleme harika çalışıyor.

Ancak, görünümü PreviewProvider'dan nasıl başlatabilirim?

Örneğin:

struct AddProjectView: View {

    @Binding public var showModal: Bool

    var body: some View {

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

Bunu yapamam, çünkü "true" bir Bağlayıcı değildir:

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

" Özellik sarmalayıcılar henüz yerel özelliklerde desteklenmiyor " çünkü bunu yapamam :

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

Bunu nasıl yapabiliriz?

Teşekkürler!!

Yanıtlar:


15

.constant tam olarak bunun içindir:

/// Değişmez bir ciltleme oluşturur 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))
    }
}

Mükemmel! - Harika!
drewster

5

Önizlemenizde @State olarak bildirmeniz gerekir.

struct AddProjectView_Previews: PreviewProvider {

     @State static var showModal: Bool = false

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

Ayrıca, statik bir işlevde kullanıldığı için statik olması gerektiğini unutmayın.


1
XCode 11.3'teki davranış, etkin olarak kullanmakla aynıdır .constant(false), yani canlı önizlemeyi kullanırsanız değer değiştirilemez.
Fabian Streitel

4

Yalnızca sabit bir değere ihtiyacınız varsa , şunu kullanın .constant(VALUE):

struct YourView_Previews: PreviewProvider {

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

}

Canlı önizlemede değiştirilebilecek bir değere ihtiyacınız varsa , bu yardımcı sınıfı kullanmak istiyorum:

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

Şöyle kullanın:

struct YourView_Previews: PreviewProvider {

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

}

Bu, canlı önizlemede bağlamayı değiştirmeyi test etmenizi sağlar.


Cevabınızın daha iyi kod üretmeme nasıl yardımcı olduğu hakkında hiçbir fikriniz yok. Milyonlarca kez teşekkürler. Hala yazdığınız SWIFTUI ve BindingProvider'ı öğreniyorum, sınırlı hızlı bilgimin hemen ötesinde. % 100 anlamadım ama anlamıyorum. Yine de teşekkürler.
GrandSteph

Yardımcı olduğuma sevindim! Devam et ve öğrenmeye devam et: D
Fabian Streitel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.