स्विफ्टयूआई में ऑब्जेक्टिव चेंज होने पर लिस्ट में एनीमेशन को डिसेबल कैसे करें?


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

जब तक Apple हमें सूची में करने के लिए परिवर्तन नहीं देता है, तब तक कॉल करें List.id (_ :) यह सूची की आंतरिक स्थिति को बदलता है और सूची को बिना किसी एनीमेशन के, तुरंत पुनः बनाने के लिए मजबूर करता है। विवरण के लिए सूची पुन: लोड करें एनीमेशन ग्लिच देखें

वही किसी भी View (func id) (व्यू प्रोटोकॉल का हिस्सा है) पर किया जा सकता है, लेकिन आपको यह जानना होगा कि सभी राज्य चर प्रारंभिक "डिफ़ॉल्ट" स्थिति में होंगे, इसलिए इसे सावधानी से उपयोग करें। यह "व्यू" को रीक्रिएट करने जैसा है।

यह कैसे काम करता है यह समझने में सक्षम होने के लिए, https://swiftui-lab.com/swiftui-id/ देखें


1

मैंने जो समाधान पाया वह एक अद्वितीय पहचानकर्ता को जोड़ना है जो हर बार बदलता है, इसलिए यह एनीमेशन के बिना हर बार सूची का पुनर्निर्माण करेगा। IOS 13.4 पर सत्यापित।

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

-3
  1. यदि आप उपयोग नहीं करते हैं, तो सूची के अंदर ForEach का उपयोग करने की कोई आवश्यकता नहीं है Section। इसलिए इसके बजाय:

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

    निम्नलिखित कोड लिखने के लिए पर्याप्त है:

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

    और यह जानना भी बेहतर है कि ForEach के उपयोग से कुछ समस्याएं पैदा हो सकती हैं, उदाहरण के लिए: SwiftUI: क्या ForEach + ContextMenu का उपयोग करना संभव है?

  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)

    मुझे macOS 10.15.2 (19C57) दोनों पर परीक्षण किया गया है और यह पूरी तरह से काम करता है।

  3. इसके अलावा, आप .animation(nil)पर Listऔर ForEachदोनों का उपयोग करने की कोशिश कर सकते हैं । मैंने कोशिश नहीं की ... लेकिन मुझे लगता है कि यह आपको आवश्यक प्रभाव भी देगा।

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

.animation(nil)लगता है 13.3 पर कोई प्रभाव नहीं है, दुर्भाग्य से
Fabian Streitel

@FabianStreitel मुझे macOS 10.15.2 (19C57) पर भाग 2 का परीक्षण किया गया है और यह पूरी तरह से काम करता है।
एंड्रयू

और मैं iOS 13.3 पर सभी तीन वेरिएंट का परीक्षण कर रहा हूं (जैसा कि ऊपर मेरी टिप्पणी में कहा गया है) और उनमें से कोई भी सूची व्यवहार को बिल्कुल नहीं बदलता है। ओपी ने यह नहीं बताया कि वे एक आईओएस या मैकओएस ऐप बना रहे हैं, दुर्भाग्य से। लेकिन मुझे लगता है कि आईओएस पर काम नहीं करने वाली जानकारी दूसरों के लिए भी प्रासंगिक है।
फेबियन स्ट्रेइटेल

मैंने हाल ही में .animation(nil)iOS 13.4 के साथ Xcode 11.4 का उपयोग करके परीक्षण किया , और यह मेरे लिए काम करता है।
सिमेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.