সুইফটুই - প্যারামিটার হিসাবে এনভায়রনমেন্টবজেক্ট ব্যবহার করে আমি কীভাবে একটি পর্যবেক্ষনবীক্ষণ সূচনা করব?


9

আমি নিশ্চিত নই যে আমরা বাস করি এই সাহসী নতুন সুইফটুআই জগতের এটি যদি প্রতিরোধক হয় তবে মূলত আমার কাছে একটি @ এনভায়রনমেন্ট অবজেক্ট রয়েছে যাতে এটিতে সংরক্ষিত কিছু মৌলিক ব্যবহারকারীর তথ্য যা আমার ভিউগুলি কল করতে পারে।

আমার কাছে একটি @ObmittedObjectও রয়েছে যা এই দর্শনটির জন্য প্রয়োজনীয় কিছু ডেটার মালিক।

যখন দৃশ্যটি উপস্থিত হয়, আমি @ পরিবেশিত বিষয়টিকে @ অবজারভেটবজেক্টটি শুরু করতে ব্যবহার করতে চাই:

struct MyCoolView: View { 

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

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

দুর্ভাগ্যক্রমে আমি আরম্ভের পরে পর্যন্ত পরিবেশের পরিবর্তনশীলটিতে নিজেকে কল করতে পারি না:

"সম্পত্তি ইনিশিয়ালাইজারের মধ্যে উদাহরণ সদস্য 'ব্যবহারকারীর ডেটা' ব্যবহার করতে পারবেন না; সম্পত্তি শুরু করার আগে 'স্ব' ব্যবহারের আগে চালানো যায়" "

আমি সামনের কয়েকটি সম্ভাব্য পথ দেখতে পাচ্ছি, তবে তাদের সবাইকে হ্যাকের মতো মনে হচ্ছে। আমি কিভাবে এই কাছে যাওয়া উচিত?


হতে পারে আপনি initস্ট্রাক্টে একটি কাস্টম যুক্ত করার চেষ্টা করতে পারেন ।
নায়েম

আমি এটি চেষ্টা করেছিলাম এবং কিছুটা অদ্ভুত ত্রুটি পেয়েছি: Property wrappers are not yet supported on local properties মূলত এর বক্তব্যটি আমি একটি ডিআইডি পদ্ধতিতে একটি @ObmittedObject তৈরি করতে পারি না।
snarik

উত্তর:


9

এখানে পদ্ধতির (সহজতম আইএমও):

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

এটি নিখুঁত। মাইকুলভিউ আসলে একটি 'হোম' দর্শনের বাচ্চা ছিল যেখানে আমি অবজারভেটজেক্টটি ঘোষণা করেছিলাম। ধন্যবাদ!
स्नারিক

তবে আপনি যদি প্রতিটিবার সম্পূর্ণ নতুন ভিউবজেক্টটি তৈরি না করে ভিউবজেক্টের ভিতরে ব্যবহারকারী ডেটা ম্যানিপুলেট করতে চান?
বোবিসাদ

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) }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.