সুইফটআইআই যখন ভিউ ইনিশিয়ালাইজারে @ বাইন্ডিংয়ের প্রয়োজন হয় তখন প্রাকদর্শনপ্রদানকারী কীভাবে ইনস্ট্যান্ট করবেন


10

সুইফটুই (এক্সকোড ১১.১) এর সাথে, আমি 2-উপায় বাইন্ডিংগুলি ( @ বাইন্ডিং ব্যবহার করে ) কিছু সেট আপ করেছি । দ্বিমুখী আপডেট করা দুর্দান্ত কাজ করে।

তবে, আমি কীভাবে প্রাকদর্শনপ্রদানকারী থেকে দৃশ্যটি ইনস্ট্যান্ট করতে পারি?

উদাহরণ স্বরূপ:

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

আপনার পূর্বরূপে আপনাকে এটি @ স্টেট হিসাবে ঘোষণা করতে হবে।

struct AddProjectView_Previews: PreviewProvider {

     @State static var showModal: Bool = false

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

এছাড়াও মনে রাখবেন যে এটি একটি স্ট্যাটিক ফানકમાં ব্যবহৃত হওয়ায় এটি স্থিতিশীল হওয়া দরকার।


1
এক্সকোড ১১.৩ এর আচরণ কার্যকরভাবে ব্যবহারের মতোই .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)
        }
    }

}

এটি আপনাকে লাইভ পূর্বরূপে বাইন্ডিং পরিবর্তনের পরীক্ষা করতে দেয়।


আপনার উত্তর আমাকে কীভাবে আরও ভাল কোড তৈরি করতে সাহায্য করেছিল তা আপনার কোনও ধারণা নেই। অসংখ্য ধন্যবাদ. আমি এখনও সুইফটুই এবং বাইন্ডিংপ্রাইডার শিখছি যা আপনি লিখেছেন তা আমার সীমাবদ্ধ দ্রুতগতির জ্ঞানের বাইরে। আমি যদি 100% বুঝতে না পারি তবে তার একটি ধারণা পেয়েছি। যাই হোক ধন্যবাদ.
গ্র্যান্ডস্টেফ

সাহায্য করে আনন্দ পেলাম! এটি চালিয়ে যান এবং শেখা চালিয়ে যান: ডি
ফ্যাবিয়ান স্ট্রিটেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.