2009-05-08 25 views
5

पर कुछ मदद की सराहना की जाएगी!UITableView सेल रीफ्रेश करने की समस्या

मेरे पास एक कस्टम यूआईटीबल व्यू सेल है, जिसमें एक छवि (हरा, नारंगी या लाल) और विभिन्न फ़ॉन्ट आकारों में दो लेबल शामिल हैं। UITableView ऑब्जेक्ट्स के एनएसएमयूटेबलएरे द्वारा संचालित होता है।

UITableView को तीन खंडों में विभाजित किया गया है, जिसमें पहले खंड के साथ लाल छवि के साथ सभी कक्ष होते हैं, नारंगी के साथ दूसरा खंड, हरे रंग के साथ तीसरा अनुभाग होता है।

मैंने UITableView के भीतर कोशिकाओं को पुनर्व्यवस्थित करने की क्षमता लागू की है, जिससे उपयोगकर्ता लाल रंग से नारंगी अनुभाग में लाल छवि वाले एक आइटम को खींचने की अनुमति देता है। यह ड्रैगिंग बहुत अच्छा काम करता है, और अंतर्निहित डेटा सही ढंग से अपडेट किया जाता है। मुझे पता है कि यह मामला है क्योंकि यदि मैं सेल का चयन करता हूं, तो मैं इसके विस्तार दृश्य पर जाता हूं और डेटा अपडेट किया जाता है।

हालांकि, UITableView तब तक अपडेट नहीं होता जब तक कि मैं विस्तार से नहीं जाता (या ऐप से बाहर निकलता हूं) और वापस आ जाता हूं! यह अद्यतन भी करता है अगर मैं अपमानजनक सेल को दृश्य से बाहर स्क्रॉल करता हूं और फिर से देखने में वापस जाता हूं, इसलिए सरणी में स्पष्ट डेटा स्पष्ट रूप से होता है। मैं सिर्फ एक दृश्य ताज़ा ट्रिगर नहीं कर सकता!

मैं moveRowAtIndexPath में अंतर्निहित डेटा को बदलने के लिए मेरे कोड के बाद निम्नलिखित की कोशिश की है:

[self.tableView reloadData]; 

हालांकि इस एक अपवाद का कारण बनता है। वास्तव में ऐप्पल भाषा संदर्भ कहता है कि डालने या हटाने के दौरान पुनः लोड डेटा को कॉल नहीं किया जा सकता है, जो निश्चित रूप से मैं कर रहा हूं। इसके अलावा,

[self setNeedsDisplay]; 

के साथ सेल ताज़ा करने के लिए काम नहीं करता है (हालांकि यह या तो दुर्घटना नहीं करता है) सिर्फ कोशिश कर रहा।

कोई विचार है कि मैं UITableView को रीफ्रेश कैसे कर सकता हूं? मुझे बाद में नहीं मिल रहा है MowHasBeen पूर्ण: विधि या कुछ भी, इसलिए यदि मैं अपने चाल के दौरान reloadData को कॉल नहीं कर सकता RowAtIndexPath: विधि तो मैं इसे कहां कहूं ?!

उत्तर

4

समझ गया !!

मुझे पता चला कि रिफ्रेश कोड में देरी को हल करना था, जिसने इसे क्रैश होने से रोक दिया था।

मैं एक अलग विधि में reloadData कॉल डाल:

- (void)refreshDisplay:(UITableView *)tableView { 
[tableView reloadData]; } 

और फिर एक 0.5 सेकंड की देरी के साथ यह कहा जाता है:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5]; 

और यह दुर्घटना नहीं था और इसके बजाय ताजा! 0.5 सेकंड देरी मुश्किल से ध्यान देने योग्य और पूरी तरह से स्वीकार्य है।

उम्मीद है कि यह किसी और की मदद करेगा!

धन्यवाद

फिल

+3

या यह सिर्फ एक गंदा हैक है? क्या कोई "एनीमेशन पूर्ण" विधि है जिसका मैं उपयोग कर सकता हूं? ... – h4xxr

+0

यह ऐप्पल डेवलपर थ्रेड पर gpmoore की पोस्ट के अनुसार ऐसा करने का सबसे अच्छा तरीका प्रतीत होता है: http://discussions.apple.com/thread.jspa ? messageID = 8450874 – Tim

+0

यह निराशाजनक है लेकिन बहुत आश्वस्त है! धन्यवाद! – h4xxr

2

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

tableView:didEndEditingRowAtIndexPath:
या
tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
का उपयोग करेंगे।

+0

दुर्भाग्य से, tableView: didEndEditingRowAtIndexPath केवल "पक्ष कड़ी चोट" कार्रवाई निरस्त करने के बाद को गति प्रदान करने लगता है। यहां तक ​​कि अगर मैं उस बिंदु को ट्रैक करने में सक्षम था जिस पर संपादन समाप्त हुआ (यानी जब उपयोगकर्ता "पूर्ण" क्लिक करता है), तब भी छवियां उस बिंदु तक गलत हो जाएंगी। दूसरी विधि जो आप सुझाव देते हैं मैं पहले से ही अन्य अनुभागों को खींचने और ड्रॉप करने की अनुमति देने के लिए उपयोग कर रहा हूं। इससे पहले कि मुझे पता चले कि मुझे रीफ्रेश करने की आवश्यकता है या नहीं। – h4xxr

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