स्विफ्टुई - मैं एक पैरामीटर के रूप में एन्वायर्नोबोबेक्ट का उपयोग करके किसी ओब्जेक्ट ओब्जेक्ट को कैसे शुरू कर सकता हूं?


9

मुझे यकीन नहीं है कि अगर हम इस बहादुर नई स्विफ्टयूई दुनिया में रहते हैं, तो यह एक एंटीपैटर्न है, लेकिन अनिवार्य रूप से मेरे पास इसमें कुछ मूल उपयोगकर्ता जानकारी के साथ एक @EnvironmentObject है जो मेरे विचारों को कॉल कर सकता है।

मेरे पास एक @ObservedObject भी है जो इस दृश्य के लिए आवश्यक कुछ डेटा का मालिक है।

जब दृश्य दिखाई देता है, तो मैं @ObservedObject को आरंभ करने के लिए उस @EnvironmentObject का उपयोग करना चाहता हूं:

struct MyCoolView: View { 

    @EnvironmentObject userData: UserData
    @ObservedObject var viewObject: ViewObject = ViewObject(id: self.userData.UID)  

    var body: some View { 
            Text("\(self.viewObject.myCoolProperty)")
    } 
}

दुर्भाग्य से मैं आरंभीकरण के बाद तक पर्यावरण चर पर स्वयं को कॉल नहीं कर सकता:

"संपत्ति इनिशियलाइज़र के भीतर उदाहरण सदस्य 'userData' का उपयोग नहीं किया जा सकता है;

मैं कुछ संभावित मार्गों को आगे देख सकता हूं, लेकिन वे सभी हैक की तरह महसूस करते हैं। मुझे इससे कैसे संपर्क करना चाहिए?


हो सकता है कि आप initसंरचना में एक कस्टम जोड़ने की कोशिश कर सकते हैं ।
nayem

मैंने कोशिश की और कुछ हद तक अजीब त्रुटि हुई: Property wrappers are not yet supported on local properties मूल रूप से यह कहते हुए कि मैं एक init विधि में एक @ObservedObject नहीं बना सकता।
स्नारिक

जवाबों:


10

यहाँ दृष्टिकोण (सबसे सरल IMO) है:

struct MyCoolView: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        MyCoolInternalView(ViewObject(id: self.userData.UID))
    }
}

struct MyCoolInternalView: View {
    @EnvironmentObject var userData: UserData
    @ObservedObject var viewObject: ViewObject

    init(_ viewObject: ViewObject) {
        self.viewObject = viewObject
    }

    var body: some View {
            Text("\(self.viewObject.myCoolProperty)")
    }
}

यह पूर्ण है। MyCoolView वास्तव में 'होम' दृश्य के लिए एक बच्चा था जहां मैंने ऑब्जर्व्डऑब्जेक्ट घोषित किया था। धन्यवाद!
स्नारिक

लेकिन क्या होगा अगर आप हर बार बनाए जा रहे ViewObject के बिना ViewObject के अंदर userData में हेरफेर करना चाहते हैं?
BobiSad

0

सबव्यू बनाने के बजाय आप एक डमी इनिशियलाइज़र को अपने साथ जोड़ सकते हैं "ViewObject"ताकि आप असली इनिशियलाइज़र को कॉल करने से पहले उसे कॉल कर सकें

struct MyCoolView: View { 

    @EnvironmentObject userData: UserData
    @ObservedObject var viewObject: ViewObject

    init() {
        viewObject = ViewObject()
        defer {
            viewObject = ViewObject(id: self.userData.UID)
        }
    }

    var body: some View { 
            Text("\(self.viewObject.myCoolProperty)")
    } 
}

रिकॉर्ड के लिए मैंने इसका परीक्षण नहीं किया है


0

यहाँ यह करने के लिए एक आसान तरीका है:

struct MyCoolView: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        Observe(obj: ViewObject(id: userData.UID)) { viewObject in
             Text("\(viewObject.myCoolProperty)")
        }
    }
}

इस सहायक के साथ जो इसे काम करता है:

struct Observe<T: ObservableObject, V: View>: View {
    @ObservedObject var obj: T
    let content: (T) -> V
    var body: some View { content(obj) }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.