কোনও ভিউ আপডেট আপডেট করার জন্য কোনও সুইফটআইআই ডায়নামিকপ্রপার্টি সম্পত্তি র‌্যাপারের অভ্যন্তরীণ আপডেটগুলি আশা করা কি সঠিক?


10

আমি সুইফটইউআই সমর্থিত একটি কাস্টম প্রপার্টি র‌্যাপার তৈরি করার চেষ্টা করছি, যার অর্থ সম্পর্কিত বৈশিষ্ট্যের মানগুলিতে পরিবর্তিত হওয়ায় সুইফটইউআই ভিউতে আপডেট হবে। আমার কাছে যা আছে তার একটি সরলীকৃত সংস্করণ এখানে:

@propertyWrapper
public struct Foo: DynamicProperty {
    @ObservedObject var observed: SomeObservedObject

    public var wrappedValue: [SomeValue] {
        return observed.value
    }
}

আমি দেখতে পাচ্ছি যে ObservedObjectআমার কাস্টম সম্পত্তির মোড়কের ভিতরে থাকা সত্ত্বেও, সুইফ্টইউআই এখনও SomeObservedObjectততক্ষণ পরিবর্তনগুলি ধরবে :

  • আমার সম্পত্তি আবরণ একটি কাঠামো
  • আমার সম্পত্তির মোড়ক মেনে চলে DynamicProperty

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

এর ডকস DynamicProperty(এক্সকোডের মধ্যে, অনলাইনে নয়) মনে করে যে এই জাতীয় সম্পত্তি এমন একটি সম্পত্তি যা বাইরের দিক থেকে দৃষ্টিভঙ্গিটি পুনরায় চিত্রিত করে দেয়, তবে এই প্রোটোকলের সাথে আপনি নিজের প্রকারের অনুসারী হলে কী হবে তার কোনও গ্যারান্টি নেই।

আমি কি ভবিষ্যতের সুইফটইউআই রিলিজে এটির কাজ চালিয়ে যেতে আশা করতে পারি?


4
এই বিষয়টির প্রত্যাশা কী তা পরিষ্কার নয় ... একটি শেষ প্রশ্নের উত্তর? কেউ যদি "হ্যাঁ, নিশ্চিত, আপনি আশা করতে পারেন" উত্তর দেয় তবে আপনি কি সত্যই বিশ্বাস করবেন? ))
Asperi

উত্তর:


6

ঠিক আছে ... অনুরূপ জিনিস পেতে এখানে বিকল্প পদ্ধতি রয়েছে ... তবে কাঠামোটি কেবল DynamicPropertyচারদিকে আবৃত @State(ভিউ রিফ্রেশকে বাধ্য করতে)।

এটি সাধারণ মোড়কযুক্ত তবে নিম্নলিখিত ভিউ রিফ্রেশ সহ যে কোনও কাস্টম গণনাগুলিকে সজ্জিত করার সম্ভাবনা দেয় ... এবং কেবলমাত্র মূল্য-ধরণের ব্যবহার করে বলা হয়েছে।

এখানে ডেমো রয়েছে (এক্সকোড 11.2 / আইওএস 13.2 দিয়ে পরীক্ষিত):

@ স্টেটে মোড়ক হিসাবে ডায়নামিকপ্রপার্টি

এখানে কোড:

import SwiftUI

@propertyWrapper
struct Refreshing<Value> : DynamicProperty {
    let storage: State<Value>

    init(wrappedValue value: Value) {
        self.storage = State<Value>(initialValue: value)
    }

    public var wrappedValue: Value {
        get { storage.wrappedValue }

        nonmutating set { self.process(newValue) }
    }

    public var projectedValue: Binding<Value> {
        storage.projectedValue
    }

    private func process(_ value: Value) {
        // do some something here or in background queue
        DispatchQueue.main.async {
            self.storage.wrappedValue = value
        }
    }

}


struct TestPropertyWrapper: View {

    @Refreshing var counter: Int = 1
    var body: some View {
        VStack {
            Text("Value: \(counter)")
            Divider()
            Button("Increase") {
                self.counter += 1
            }
        }
    }
}

struct TestPropertyWrapper_Previews: PreviewProvider {
    static var previews: some View {
        TestPropertyWrapper()
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.