2012-09-02 10 views
5

मैं कर रहा हूँ इस तरह UITableView में कुछ पंक्तियां हटाना:हटा सकते हैं और फिर से लोड UITableView कोशिकाओं

[tableView deleteRowsAtIndexPaths:toDelete withRowAnimation:UITableViewRowAnimationAutomatic]; 

इसे हटाना आपरेशन के लिए एक अच्छा एनीमेशन कहते हैं।

हालांकि, हटाने के बाद मुझे वर्तमान में दिखाई देने वाली सभी पंक्तियों को अपडेट करने की आवश्यकता है।

[tableView reloadData]; 

सही पहली कॉल काम करता है के बाद कॉलिंग, लेकिन अच्छा एनीमेशन प्रभाव चला गया है। ऐसा करने का एक बेहतर तरीका क्या है? यानी, हटाए गए ऑपरेशन को एनिमेट करने के लिए, और वर्तमान में सभी दृश्यमान पंक्तियों को अपडेट करें? धन्यवाद!

मुझे ऐसा करने की आवश्यकता क्यों है क्योंकि प्रत्येक सेल में 'चेकबॉक्स' होता है। मेरा व्यू कंट्रोलर चेकबॉक्स का प्रतिनिधि है और प्रत्येक चेकबॉक्स में इसके साथ जुड़े एनएसआईएंडएक्सपैथ हैं। जब चेकबॉक्स को टॉगल किया जाता है, तो प्रतिनिधि को यह कहकर कहा जाता है कि हम एक्स इंडेक्स पथ के लिए टॉगल किए गए हैं। अब, अगर कुछ पंक्तियां हटा दी जाती हैं, तो सूचकांक पथ को अद्यतन करने की आवश्यकता होती है। यही कारण है कि मुझे सब कुछ पुनः लोड करने की आवश्यकता है ताकि प्रत्येक चेकबॉक्स जानता हो कि यह कहां से संबंधित है।

+0

आपको हटाने के बाद पुनः लोड करने की आवश्यकता क्यों है? (क्या आप DeleteRowsAtIndexPaths को कॉल करने से पहले डेटा स्रोत से पंक्ति को हटा नहीं सकते हैं, या कुछ और महत्वपूर्ण चल रहा है?) –

+0

मुझे याद नहीं है कि यह काम करता है, लेकिन क्या आपने मॉडल-स्तरीय डिलीट करने की कोशिश की है, और फिर बस एक '[UIView एनिमेट विथ अवधि ...]' ब्लॉक में 'reloadData' रैपिंग? –

+0

@ मिडपार्का मैं अपने प्रश्न को बता दूंगा कि मुझे ऐसा करने की ज़रूरत क्यों है। – 0xSina

उत्तर

-1

नोट:टिप्पणी में बताया गया है, यह संभावना है कि इस जवाब काम नहीं करेगा। अगर इसे स्वीकार नहीं किया गया था, तो मैं इसे हटा दूंगा।

मुझे 100% यकीन नहीं है कि यह सर्वोत्तम ऐसा करने का तरीका है, लेकिन इसके बारे में कुछ सुखद साफ है। हम अंतर्निहित मॉडल संशोधित करने के बाद एक नियमित रूप से UIView एनीमेशन ब्लॉक में reloadData लपेट कर सकते हैं:

// if self.people is a mutable array 
[self.people removeObjectAtIndex:13]; 

[UIView animateWithDuration:0.5 animations:^{ 
    [self.tableView reloadData]; 
}]; 
+0

वानसन विंग लींग ने बताया कि यह काम नहीं करता है कि कोई अवधि बीत चुकी है ... – simonthumper

+0

कारण यह काम नहीं करता है मुझे लगता है कि reloadData UIView की एक एनिमेटेबल संपत्ति नहीं है, इसके बजाय आप चाहते हैं इसे इसमें बदलें, जो ठीक काम करना चाहिए: '[self.tableView प्रदर्शन चयनकर्ता: @ चयनकर्ता (पुनः लोडडेटा) ऑब्जेक्ट: शून्य बाद के बाद: 0.14];' – simonthumper

1

ctrahey की एनीमेशन ब्लॉक मेरे लिए काम नहीं करता है कोई बात नहीं क्या अवधि पारित कर दिया है। मैंने UITableView के डिलीट के तंत्र की खोज की है, & रीलोड डालें। मैं इस समस्या का सामना करते हुए गितब में अपनी परियोजना को बनाए रख रहा हूं।

https://github.com/VansonLeung/VanTableController

यह उस में एक काम इकाई परीक्षण भी शामिल है। आम तौर पर आदेश UITableView के सेल एनीमेशन चेतन करने के लिए, हम इस तरह कुछ करने के लिए:

[tableView_ beginUpdates]; 
[tableView_ deleteRowsAtIndexPaths: indexPathDelete withRowAnimation:UITableViewRowAnimationAutomatic]; 
[tableView_ insertRowsAtIndexPaths: indexPathInsert withRowAnimation:UITableViewRowAnimationAutomatic]; 
[tableView_ reloadRowsAtIndexPaths: indexPathReload withRowAnimation:UITableViewRowAnimationAutomatic]; 
[tableView_ endUpdates]; 

हम नष्ट पंक्तियों निर्धारित करने के लिए है, पंक्तियों & पुनः लोड पंक्तियों 'indexPath सरणियों डालने और यह एक बहुत बुरा काम है! मेरा प्रोजेक्ट वर्क मूल रूप से इन इंडेक्सपैथ को उत्पन्न करने के लिए एक रैपर है।

0

मुझे इससे संबंधित कुछ समस्याएं थीं। निश्चित सूचकांक का उपयोग करना शायद आपको बहुत सी सिरदर्द का सामना करना पड़ेगा। मैंने इसे UITableViewCell में अपने डेटासोर्स से किसी आइटम के संदर्भ में हल करने का हल किया है, न कि एनएसआईएंडएक्सपैथ। इसलिए, आपके सेल में सहेजे गए इंडेक्सपाथ का उपयोग करने की कोई आवश्यकता नहीं है।

इसके अलावा, ऐप्पल की वेबसाइट पर कुछ जानकारी है कि हमें विधि reloadData विधि को सम्मिलित करने या हटाने के तरीके का उपयोग नहीं करना चाहिए।

Apple docs

सभी

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

संबंधित मुद्दे