UICollectionView डेटा परिवर्तन चेतन करता है


83

अपने प्रोजेक्ट में मैं माउस का एक ग्रिड प्रदर्शित करने के लिए UICollectionView का उपयोग करता हूं।

उपयोगकर्ता एक खंडित नियंत्रण पर क्लिक करके आदेश को बदलने में सक्षम है जो विभिन्न एनएसएसओर्टडिसस्क्रिप्ट के साथ मुख्य डेटा से एक भ्रूण को बुला रहा है।

डेटा की मात्रा हमेशा समान होती है, बस विभिन्न वर्गों / पंक्तियों में समाप्त होती है:

- (IBAction)sortSegmentedControlChanged:(id)sender {

   _fetchedResultsController = nil;
   _fetchedResultsController = [self newFetchResultsControllerForSort];

   NSError *error;
   if (![self.fetchedResultsController performFetch:&error]) {
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
   }

   [self.collectionView reloadData];
}

समस्या यह है कि reloadData परिवर्तन को चेतन नहीं करता है, UICollectionView नए डेटा के साथ बस पॉप करता है।

क्या मुझे ट्रैक रखना चाहिए जिसमें indexPath परिवर्तन के पहले और बाद में था, और [self.collectionView MoveItemAtIndexPath: toIndexPath:] का उपयोग करें या परिवर्तन के लिए एनीमेशन करने के लिए बेहतर तरीका है?

मैं उप-संग्रह संग्रह में ज्यादा नहीं मिला, इसलिए कोई मदद बहुत बढ़िया होगी ...

धन्यवाद, बिल।


क्या आपने उस reloadDataकॉल को एनीमेशन ब्लॉक में लपेटने की कोशिश की है ?
सिमोन

जवाबों:


71

reloadData चेतन नहीं करता है, और न ही यह ऐसा करता है जब UIView एनीमेशन ब्लॉक में रखा जाता है। यह एक UICollecitonView पर कार्य करना चाहता है

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
} completion:^(BOOL finished) {
    // do something on completion 
}];

5
हां, यह काम करने लगता है, लेकिन केवल अगर आपके पास अनुभाग संख्याएं बची हैं ... तो मुझे "अमान्य संख्याएँ" प्राप्त हो रही हैं। अद्यतन के बाद संग्रह दृश्य में शामिल अनुभागों की संख्या (10) संख्या के बराबर होनी चाहिए अद्यतन (16) से पहले संग्रह दृश्य में शामिल अनुभाग "। मुझे मैन्युअल रूप से अनुभागों को सम्मिलित / हटाना होगा ... वैसे भी स्वीकार किया गया है! धन्यवाद।
निमरोड 7

1
"मैन्युअल रूप से", क्या आपका मतलब है UICollectionView के इन्सर्ट / मूवमेंट के माध्यम से: स्नेह: डिलीट / डिलीट करें कॉल? या कुछ और? (क्षमा करें, अब तक UICollectionView के मेरे उपयोग से वर्गों की एक स्थिर संख्या हो गई है)
स्ट्राइप्स

1
उन तरीकों के माध्यम से हाँ ... सोचा को लागू करने के लिए इसकी थोड़ी मुश्किल, आपको अपडेट से पहले और बाद में
इंडेक्सपथ

12
यह मेरे एक-खंड संग्रह दृश्य के लिए काम नहीं किया। मुझे त्रुटियाँ नहीं मिलीं, लेकिन यह चेतन नहीं हुआ। स्थानापन्न करने -reloadSections:से काम बन जाता है।
पौलमेलनिको

9
यह उत्तर सही नहीं है, क्योंकि मेरे मामले में reloadData को PerformBatchUpdates में डालने से मेरा ऐप क्रैश हो जाएगा और कह सकते हैं कि सेल की गिनती पहले और बाद में समान नहीं है। पुनः लोड का उपयोग करके मेरी समस्या हल हो गई। ऐप्पल का दस्तावेज़ यह भी बताता है कि एनीमेशन ब्लॉक में
रीलोडाटा को

145

रैपिंग -reloadDataमें -performBatchUpdates:चेतन करने के लिए एक अनुभाग संग्रह दृश्य पैदा करने के लिए नहीं लगता है।

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadData];
} completion:nil];

हालाँकि, यह कोड काम करता है:

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
} completion:nil];

9
दस्तावेज़ीकरण से ध्यान दें: आपको एनीमेशन ब्लॉक के बीच में पुनः लोड डेटा विधि को कॉल नहीं करना चाहिए जहां आइटम डाले या हटाए जा रहे हैं। सम्मिलन और विलोपन स्वचालित रूप से तालिका के डेटा को उचित रूप से अद्यतन करने का कारण बनते हैं।
राफेल ओलिवेरा

मुझे लगता है कि यह सही उत्तर होना चाहिए। क्योंकि यह मेरे लिए काम किया। मेरे पास केवल 1 अनुभाग है और यह सही उत्तर नहीं दे रहा है।
महेश अग्रवाल ०

यदि आप भी सम्मिलित कर रहे हैं तो काम नहीं करता है। सॉर्टिंग एनीमेशन को ओवरराइड करेगा।
एंड्रेस कैनेला

3
वर्थ नोटिंग कि आपको एनीमेशन प्राप्त करने के लिए self.collectionView performBatchUpdatesकॉल को लपेटे जाने की आवश्यकता नहीं है reloadSections। वास्तव में performBatchUpdatesकॉल कुछ मामलों में अनजाने चंचल / सेल-आकार के मुद्दों का कारण हो सकता है।
पॉल पोपिएल

1
या सिर्फ [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; reloadSectionsसंग्रह दृश्य या तालिका दृश्य में एनीमेशन के साथ ऐसा करेंगे।
bauerMusic

67

यह वही है जो मैंने सभी अनुभागों को पुनः लोड करने के लिए किया था:

[self.collectionView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.collectionView.numberOfSections)]];

स्विफ्ट 3

let range = Range(uncheckedBounds: (0, collectionView.numberOfSections))
let indexSet = IndexSet(integersIn: range)
collectionView.reloadSections(indexSet)


3

एक performBatchUpdates:completion:ब्लॉक के अंदर पूरे संग्रह दृश्य को पुनः लोड करना iOS 9 सिम्युलेटर पर मेरे लिए एक गड़बड़ एनीमेशन है। यदि आपके पास कोई विशिष्ट है UICollectionViewCellजिसे आप हटाना चाहते हैं, या यदि आपके पास इसका सूचकांक पथ है, तो आप deleteItemsAtIndexPaths:उस ब्लॉक में कॉल कर सकते हैं । का उपयोग करके deleteItemsAtIndexPaths:, यह एक चिकनी और अच्छा एनीमेशन करता है।

UICollectionViewCell* cellToDelete = /* ... */;
NSIndexPath* indexPathToDelete = /* ... */;

[self.collectionView performBatchUpdates:^{
    [self.collectionView deleteItemsAtIndexPaths:@[[self.collectionView indexPathForCell:cell]]];
    // or...
    [self.collectionView deleteItemsAtIndexPaths:@[indexPath]];
} completion:nil];

1
बस एक ऐसी बात का उल्लेख करना चाहते हैं जो मेरे मामले में क्रैश समस्या को हल करती है, संग्रह दृश्य पर प्रदर्शन को कॉल करने से पहले डेटा स्रोत (यानी अनुभाग / आइटम गणना) को अपडेट करें।
वीरूमैक्स

एनीमेशन अन्य संचालन से है; वहाँ है, और कभी भी किसी भी अंक को पुनः लोड करने के लिए एक एनीमेशन के तहत नहीं था। सम्मिलित करें। बढ़ते क्रम में आवेषण, और अद्यतन के बाद किया जाता है; deleteItems इसके विपरीत है।
जेम्स बुश

1

सहायता पाठ कहता है:

संग्रह दृश्य में सभी आइटम पुनः लोड करने के लिए इस विधि को कॉल करें। यह संग्रह दृश्य को किसी भी दृश्यमान आइटम को छोड़ने और उन्हें फिर से प्रदर्शित करने का कारण बनता है। दक्षता के लिए, संग्रह दृश्य केवल उन कोशिकाओं और पूरक विचारों को प्रदर्शित करता है जो दिखाई देते हैं। यदि संग्रह डेटा पुनः लोड होने के परिणामस्वरूप सिकुड़ जाता है, तो संग्रह दृश्य अपने स्क्रॉलिंग ऑफ़सेट को तदनुसार समायोजित करता है। आपको इस विधि को एनीमेशन ब्लॉकों के बीच में नहीं डालना चाहिए जहां आइटम डाले या हटाए जा रहे हैं। सम्मिलन और विलोपन स्वचालित रूप से तालिका के डेटा को उचित रूप से अद्यतन करने का कारण बनते हैं।

मुझे लगता है कि मुख्य भाग "संग्रह दृश्य को किसी भी दृश्यमान आइटम को छोड़ने का कारण बनता है"। यह उन वस्तुओं की आवाजाही को चेतन करने वाला है जो इसे त्याग चुके हैं?


वास्तव में, यह नहीं है। reloadData एक एनीमेशन-कम, दोहरा ऑपरेशन है; यह पहले एक डिलीट ऑपरेशन है, और फिर एक इंसर्ट ऑपरेशन है।
जेम्स बुश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.