2011-11-17 11 views
21

मैं अपने tableview को अद्यतन करने के बारे में एक मुश्किल समस्या है, मैं इसे अद्यतन करने के विभिन्न तरीकों का उपयोग कर विभिन्न परिणाम प्राप्त, मुझे स्पष्ट करता हूं:tableview reloadData बनाम beginUpdates और endUpdates

स्थिति 1: मैं [tbl reloadData]; जहां tbl का उपयोग टेबलव्यू अपडेट करने के लिए मेरा टेबल व्यू है - इरादे के अनुसार काम करता है।

स्थिति 2: मैं का उपयोग करें:

[tbl beginUpdates]; 
[tbl reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationRight]; 
[tbl endUpdates]; 

कहाँ tbl मेरी tableview है, और indexPaths सभी indexPaths tableview में मौजूद युक्त एक सरणी है। अब सरणी ठीक है, इसमें सभी सही इंडेक्सपैथ (डबल और ट्रिपल चेक) शामिल हैं लेकिन किसी कारण से - यह इरादे से काम नहीं करता है।

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

तो, मेरे प्रश्न के नीचे: क्या तालिका दृश्य (पाठ्यक्रम के एनीमेशन बिट से अलग) को अपडेट करने के दो तरीकों के बीच कोई अंतर है या मुझे समस्या को कहीं और रखना चाहिए?

संपादित करें:

cellForRowAtIndexPath -method में मैं एक नियत टैग जो सेल की indexPath पंक्ति के बराबर है के साथ प्रत्येक कक्ष के लिए एक बटन जोड़ें: ठीक है, मैं समझाने के लिए क्या लक्षण हैं की कोशिश करेंगे , इस तरह के तरह:

btn.tag = indexPath.row; 

कारण मैं इस तो मैं प्रत्येक बटन की पहचान कर सकते हैं के रूप में वे सभी एक ही समारोह फोन है:

- (void)btnPressed:(id)sender 

जब मैं कोशिकाओं को अद्यतन करता हूं - क्योंकि कोशिकाओं में कुछ मान बदल गए हैं - स्थिति 1 सबकुछ ठीक काम करता है, स्थिति 2 हालांकि - टैग को मिश्रित करती है ताकि अगली बार बटनों में से एक दबाया जा सके, उनके पास अब नहीं होगा सही टैग

मिश्रण-अप मेरे लिए यादृच्छिक दिखाई देता है, लेकिन यादृच्छिकरण अलग-अलग होता है कि मैं कौन से सेल्स बटन को दबाता हूं। मुझे उम्मीद है कि यह मेरी समस्या को स्पष्ट करता है।

+1

"मुझे अलग-अलग परिणाम मिलते हैं," "यह इरादे से काम नहीं करता है।" किस तरह से? – TigerCoding

+0

ठीक है, प्रत्येक सेल को टैग पर एक बटन मिलता है, जहां टैग बटन होता है, जहां 'बटन टैग = इंडेक्स पथ पंक्ति' होता है। स्थिति 1 में बटन सही टैग प्राप्त करता है, स्थिति 2 में - यह नहीं करता है। –

उत्तर

19

UITableView प्रलेखन

beginUpdates
विधि की एक श्रृंखला शुरू से कहता है कि डालने, हटाने या चयन पंक्तियों और रिसीवर के वर्गों।

इसका मतलब है, जब तक आप डालने, हटाने या चुनने के लिए इसका उपयोग नहीं करना चाहिए। आप इनमें से न तो कर रहे हैं।

इसके अलावा, आपको beginUpdatesendUpdates के साथ reloadData पर समाप्त करना चाहिए।प्रलेखन:

विधियों का यह समूह एंडअपडेट्स के आमंत्रण के साथ निष्कर्ष निकालना चाहिए।

+1

आह, हाँ 'पुनः लोडडाटा'-बिट मेरी पोस्ट में एक टाइपो था - मेरा बुरा। –

+0

ठीक है, इससे reloadData और startUpdates/endUpdates के बीच का अंतर समाप्त होता है, लेकिन मैं वास्तव में यह नहीं कर सकता कि कैसे इस अंतर से मेरे परिणामों को प्रभावित करना चाहिए। मुझे एहसास है कि मैं परिणामों का वर्णन करने में थोड़ा अस्पष्ट रहा हूं, मैं कुछ मिनटों में अपना मूल प्रश्न अपडेट करूंगा। –

+0

'startUpdates' और' endUpdates' ड्रॉप करने का प्रयास करें। वे 'UpdateRowsAtIndexPaths' के आस-पास नहीं हैं। – Mundi

3

reloadData और reloadRowsAtIndexPaths के बीच पहली अंतर जब कर 2 UITableViewCell वस्तुओं एक ही indexPath के लिए simulteaneosuly आवंटित देखते हैं कि है reloadRowsAtIndexPaths (tableview नया सेल में 'मिश्रित' क्योंकि)। यह कभी-कभी cellForRowAtIndexPath में कोड द्वारा पूर्ववत नहीं होता है। आश्चर्य इस तथ्य से आता है कि भले ही किसी सेल को पहले से किसी विशेष सेल के लिए आवंटित किया गया हो, तालिका दृश्य आपको dequeueReusableCellWithIdentifier में reloadRowsAtIndexPaths पर कॉल करते समय इस सेल को वापस नहीं देता है, इसके बजाय यह शून्य देता है । विरोधाभास में reloadData पहले से आवंटित कोशिकाओं का पुन: उपयोग करता है।

2 अंतर यह है कि endUpdatesreloadRowsAtIndexPaths के बाद सीधे cellForRowAtIndexPath कॉल जबकि reloadData कार्यक्रम बाद में cellForRowAtIndexPath के लिए कॉल (स्टैक ट्रेस में दिखाई नहीं) (यदि आप एक ब्रेकपाइंट वहाँ निर्धारित करते हैं, endUpdates स्टैक ट्रेस में दिख रहा है) है ।

हालांकि आपको यह जानकारी देने के लिए थोड़ा और कोड पोस्ट करना होगा कि आप वहां क्या कर रहे हैं। सिद्धांत रूप में जब तक आप पंक्तियों को हटा या डालेंगे तब तक नई कोशिकाओं के इंडेक्सपैथ पुराने लोगों के समान होते हैं, reloadRowsAtIndexPaths के साथ।

+0

आपके उत्तर लियो के लिए धन्यवाद। यह कुछ सालों से रहा है और मुझे याद नहीं है कि इस परियोजना के साथ क्या हुआ, हालांकि मुझे संदेह है कि मैंने कभी इसे हल किया है, उम्मीद है कि यह क्यू और आपके द्वारा दिए गए उत्तर और @ मुंडी इसी तरह के मुद्दों के साथ किसी और की मदद करेंगे। –

0

यदि आप बाद में सम्मिलन, हटाना, और चयन संचालन चाहते हैं (उदाहरण के लिए, cellForRowAtIndexPath: और indexPathsForVisibleRows) को एनिमेटेड होने के लिए इस विधि को कॉल करें।

मुझे लगता है कि यह वही है जो आप चाहते हैं। प्रारंभ 0dendUpdates एनीमेशन के साथ UItableview बदल सकते हैं।

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

  • कोई संबंधित समस्या नहीं^_^