SwiftUI এ অবজেক্টের পরিবর্তনগুলি পর্যালোচনা করা হলে তালিকায় অ্যানিমেশন কীভাবে অক্ষম করবেন?


15

মডেলের ডেটা পরিবর্তনগুলি দেখার সময় আমি কীভাবে অ্যানিমেশন অক্ষম করব?

আমার কাছে নিম্নলিখিত কোড রয়েছে:

struct FormView: View {

    @ObservedObject var viewModel: FormViewModel

    var body: some View {
        List {
            ForEach(viewModel.options) { option in
                Text(option.displayValue)
            }
        }
    }
}

প্রতিবার মডেল পরিবর্তনগুলি Listঅ্যানিমেশন সহ আপডেট হয়।
আমি কীভাবে এটি অক্ষম করতে পারি?
আমি যোগ করার চেষ্টা করেছি .animation(nil)কিন্তু তাতে কোনও লাভ হয় না

উত্তর:


1

অ্যাপল আমাদের তালিকার তালিকায় এটি করার জন্য পরিবর্তন না দেওয়া অবধি কাজটিকে কল লিস্ট.ইড (_ :) এটি তালিকার অভ্যন্তরীণ অবস্থার পরিবর্তন করে এবং কোনও অ্যানিমেশন ছাড়াই তালিকাকে তাত্ক্ষণিকভাবে পুনরায় তৈরি করতে বাধ্য করে। বিশদের জন্য তালিকা পুনরায় লোড অ্যানিমেশন গ্লিটগুলি দেখুন

এটি কোনও ভিউতে করা যেতে পারে (ফানক আইডি () ভিউ প্রোটোকলের অংশ) তবে আপনাকে জানতে হবে যে সমস্ত রাজ্যের ভেরিয়েবলগুলির প্রাথমিক "ডিফল্ট" অবস্থা থাকবে, সুতরাং এটি সাবধানে ব্যবহার করুন। এটি ভিউটিকে "পুনরায় তৈরি" করার মতো।

এটি কীভাবে কাজ করে তা বুঝতে সক্ষম হতে, https://swiftui-lab.com/swiftui-id/ দেখুন


1

আমি যে সমাধানটি পেয়েছি তা হ'ল একটি অনন্য শনাক্তকারী যুক্ত করুন যা প্রতিবার পরিবর্তিত হয়, সুতরাং এটি অ্যানিমেশন ছাড়াই প্রতিবার তালিকাটি পুনর্নির্মাণ করবে। আইওএস 13.4 এ যাচাই করা হয়েছে।

var body: some View {
    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        }
    }
    .id(UUID()) // no animation
}

-3
  1. আপনি যদি ব্যবহার না করেন তবে তালিকার অভ্যন্তরে ফরইচ ব্যবহার করার দরকার নেই Section। এর পরিবর্তে:

    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        })
    }

    নিম্নলিখিত কোডটি লেখার জন্য যথেষ্ট:

    List(viewModel.options) { option in
        Text(option.displayValue)
    }

    এবং আরও জেনে রাখা ভাল যে ফোরইচ ব্যবহার করা কিছু সমস্যা তৈরি করতে পারে, উদাহরণস্বরূপ: সুইফটইউআই: ফোরইচ + কনটেক্সটমেনু ব্যবহার করা কি সম্ভব?

  2. আপনি কেবল ForEach()বা কেবল List()+ ব্যবহার করবেন .animation(nil)- আপনার সমস্যার সমাধান করতে হবে:

    নমুনা 1:

    ForEach(viewModel.options) { option in
        Text(option.displayValue)
    }.animation(nil)

    নমুনা 2:

    List(viewModel.options) { option in
        Text(option.displayValue)
    }.animation(nil)

    আমি ম্যাকোএস 10.15.2 (19C57) এ উভয় পরীক্ষা করে দেখেছি এবং এটি পুরোপুরি কার্যকর works

  3. এছাড়াও আপনি ব্যবহার করার চেষ্টা করতে পারেন .animation(nil)উপর Listএবং ForEachউভয়। আমি চেষ্টা করিনি ... তবে আমি মনে করি এটি আপনাকে প্রয়োজনীয় প্রভাব দেবে।

    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        }.animation(nil)
    }.animation(nil)

.animation(nil)দুর্ভাগ্যক্রমে 13.3-এ কোনও প্রভাব ফেলেছে বলে মনে হচ্ছে
ফ্যাবিয়ান স্ট্রেইটেল

@ ফ্যাবিয়ান স্ট্রিটেল আমার ম্যাকোস 10.15.2 (19 সি 57) তে অংশ 2 পরীক্ষা করা হয়েছে এবং এটি পুরোপুরি কার্যকর হয়েছে।
অ্যান্ড্রু

এবং আমি আইওএস ১৩.৩ এ তিনটি বৈকল্পের পরীক্ষা করেছি (উপরে আমার মন্তব্যে বর্ণিত) এবং তাদের কোনওটিই তালিকা আচরণের কোনও পরিবর্তন করে না। দুর্ভাগ্যক্রমে তারা কোনও আইওএস বা ম্যাকোস অ্যাপ তৈরি করছে কিনা তা ওপিতে উল্লেখ করা হয়নি। তবে আমি মনে করি যে তথ্যটি এটি iOS এ কাজ করে না তা অন্যদের জন্যও প্রাসঙ্গিক।
ফ্যাবিয়ান স্ট্রেইটেল

আমি সম্প্রতি .animation(nil)আইওএস 13.4 দিয়ে এক্সকোড 11.4 ব্যবহার করে পরীক্ষা করেছি এবং এটি আমার পক্ষে কাজ করে।
সাইমেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.