SwiftUI पूर्वावलोकन में जब @Binding की आवश्यकता होती है, तो पूर्वावलोकनपॉइडर को त्वरित कैसे करें


10

SwiftUI (Xcode 11.1) के साथ, मुझे कुछ व्यूज़ 2-बाइंडिंग ( @Binding का उपयोग करके ) के साथ मिला है। दो-तरफ़ा अद्यतन महान काम करता है।

हालाँकि, मैं पूर्वावलोकनप्रॉइडर से दृश्य को कैसे त्वरित कर सकता हूं?

उदाहरण के लिए:

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

उत्तम! -- बहुत बढ़िया!
ड्रूस्टर

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), अर्थात यदि आप लाइव पूर्वावलोकन का उपयोग करते हैं, तो मान को परिवर्तित नहीं किया जा सकता है।
फाबियन स्ट्रेइटेल

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% समझ में नहीं आता है। फिर भी धन्यवाद।
ग्रैंडस्टेप

मदद करने में खुशी! इसे बनाए रखें और सीखते रहें: D
Fabian Streitel
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.