पुन: लोड आपके आवेदन के उपयोगकर्ता के लिए गरीब अनुभव बनाता है। इस तथ्य के बावजूद कि यह कार्य करने के लिए यह प्रभावी तरीका नहीं है, इसके कुछ नकारात्मक साइड इफेक्ट्स भी हैं - चयनित पंक्तियों को पुनः लोड करने के बाद चयनित नहीं किया जाता है और परिवर्तन एनिमेटेड नहीं होता है।
UITableView
में विधियां हैं जो तालिका दृश्य की सामग्री को गतिशील रूप से बदलने के लिए बनाई गई हैं।ये हैं:
insertRowsAtIndexPaths:withRowAnimation:
moveRowAtIndexPath:toIndexPath:
deleteRowsAtIndexPaths:withRowAnimation:
सूचना है कि इन तरीकों आप जो निर्दिष्ट आपरेशन किया जाता है का उपयोग किया जाएगा एनीमेशन की तरह निर्दिष्ट कर सकते हैं - जब आप reloadData
का उपयोग तालिका दृश्य की सामग्री को संशोधित करने के लिए आप इस तरह का व्यवहार हासिल नहीं कर सकते ।
इसके अलावा, आप भी (यह आवश्यक नहीं है) एक से अधिक तालिका दृश्य तालिका दृश्य के अतिरिक्त तरीकों का उपयोग कर संचालन गठजोड़ कर सकते हैं:
beginUpdates endUpdates
बस संचालन आप beginUpdates
के लिए कॉल में प्रदर्शन करने के लिए चाहते हैं लपेट और endUpdates
विधियों और तालिका दृश्य एक एनीमेशन beginUpdates
और endUpdates
कॉल के बीच अनुरोध किए गए सभी परिचालनों के लिए एनीमेशन बनाएंगे ताकि पूरा संक्रमण कुछ अलग एनिमेशंस द्वारा बनाए गए अच्छे को देख सके।
[self.tableView beginUpdates]
//calls to insert/move and delete methods
[self.tableView endUpdates]
यह आप डेटा स्रोत राज्य UITableView
द्वारा रखा एक के अनुरूप रखने के लिए वास्तव में महत्वपूर्ण है। इस कारण से आपको आश्वस्त करना होगा कि जब तालिका दृश्य अनुरोधित संचालन करने के लिए शुरू होता है तो उसका डेटा स्रोत सही मान वापस कर देगा।
[self.tableView beginUpdates]
//calls to insert/move and delete methods
//operations on our data source so that its
//state is consistent with state of the table view
[self.tableView endUpdates]
जब तालिका दृश्य संचालन करने लगते हैं? यह इस बात पर निर्भर करता है कि ऑपरेशन एनीमेशन ब्लॉक में beginUpdates
और endUpdates
विधियों द्वारा परिभाषित किया गया है या नहीं। यदि हां, तो तालिका दृश्य endUpdates
विधि कॉल के बाद संचालन करने लगता है। अन्यथा, तालिका दृश्य डालने/स्थानांतरित करने या हटाने के लिए कॉल के ठीक बाद ऑपरेशन करता है।
आप beginUpdates
और endUpdates
तरीकों का उपयोग कर रहे हैं आप को पता है कि इस मामले तालिका दृश्य में, बैचों 'का अनुरोध संचालन और उन्हें विशिष्ट क्रम जो कॉल के आदेश के रूप में ही आवश्यक नहीं है में प्रदर्शन किया है तालिका दृश्य पर कार्रवाई करने आपने अपनी टेबल व्यू ऑब्जेक्ट (Apple's documentation on this topic) पर बनाया है।
याद रखने की सबसे महत्वपूर्ण बात यह है कि सभी परिचालनों को हटाने से सभी परिचालन संचालन से पहले हमेशा किया जाता है। इसके अलावा, विलोपन ऑपरेशन अवरोही क्रम (इंडेक्स 3, 2, 1 के लिए संचालन) में किया जाता है जब सम्मिलन ऑपरेशन आरोही क्रम में किया जाता है (इंडेक्स 1, 2, 3 के लिए संचालन)। इसके बारे में याद रखें महत्वपूर्ण तालिका डेटा द्वारा रखे गए डेटा के साथ आपके डेटा स्रोत को बनाए रखने में महत्वपूर्ण है।
नीचे दिए गए उदाहरण में प्रस्तुत किए गए डेटा स्रोत और तालिका दृश्य पर संचालन के क्रम का विश्लेषण करने पर कुछ समय व्यतीत करें।
अंतिम उदाहरण:
//initial state of the data source
self.numbers = [@[@(0), @(1), @(2), @(3), @(4), @(5), @(6)] mutableCopy];
//
//...
//
NSArray indexPathsToRemove = @[[NSIndexPath indexPathForRow:3 section:0].
[NSIndexPath indexPathForRow:0 section:0];
NSArray indexPathsToAdd = @[[NSIndexPath indexPathForRow:6 section:0],
[NSIndexPath indexPathForRow:5 section:0]];
[self.tableView beginUpdates];
[self.numbers removeObjectAtIndex:3];
[self.numbers removeObjectAtIndex:0];
[self.numbers insertObject:@(10) atIndex:4];
[self.numbers insertObject:@(11) atIndex:5];
[self.tableView insertRowsAtIndexPaths:indexPathsToAdd withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView deleteRowsAtIndexPaths:indexPathsToRemove withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];
//final state of the data source ('numbers') - 1, 2, 4, 5, 6, 10, 11
असल में आप उन्हें दृश्य में नहीं जोड़ते हैं, बल्कि मॉडल के लिए भी जोड़ते हैं। ऐसा करने के बाद, टेबलव्यू रीलोड लोडडेटा विधि आपका मित्र है – HeikoG