2012-01-21 13 views
5

मुझे UITableView की reloadData विधि के साथ कुछ परेशानी हो रही है। मैंने पाया है कि अगर नई कोशिकाओं को जोड़ा या हटाया जाता है तो यह केवल सेलफॉररोएट इंडेक्सपैथ को कॉल करता है।फोर्स UITableView को सेलफोररऑट इंडेक्सपैथ कॉल करने के लिए: सभी कक्षों के लिए

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

मेरा प्रश्न: क्या तालिका दृश्य को अपनी सभी दृश्यमान कोशिकाओं में डेटा को पूरी तरह से लोड करने के लिए मजबूर करना संभव है?

उत्तर

8

मुझे समस्या मिली- मेरे पास if(cell == nil) ब्लॉक में मेरा सेल अनुकूलन कोड था, इसलिए क्योंकि कोशिकाओं को पुनर्नवीनीकरण किया जा रहा था, इसलिए उन्हें बदला नहीं जा रहा था। उस ब्लॉक से मेरा अनुकूलन कोड लेना समस्या को हल करता है।

+0

आपने मेरे घंटों के प्रयासों को बचाया। धन्यवाद! मैंने इस बेवकूफ गलती का अनुमान नहीं लगाया होगा :) – Pruthvid

+0

मेरा समाधान खुशी से किसी और की मदद कर सकता है! –

0

ठीक है, तालिका दृश्य केवल दृश्य कोशिकाओं पर cellForRowAtIndexPath पर कॉल करने जा रहा है, लेकिन यदि आप reloadData पर कॉल करते हैं तो ऐसा होगा कि यहां कुछ और चल रहा है और मुझे यकीन नहीं है कि यह क्या है।

+0

इस मामले में, सभी कोशिकाएं दिखाई दे रही हैं। मुझे पता है कि डेटा स्रोत (इस उदाहरण में, NSUserDefaults) को अद्यतन किया जा रहा है, इसलिए मुझे बिल्कुल यकीन नहीं है कि केवल नई कोशिकाओं को क्यों अपडेट किया जा रहा है। –

+0

क्या आपने इसे कॉल करने के लिए 'cellForRowAtIndexPath' पर कॉल का पता लगाया है या क्या आप दृश्य परिवर्तन नहीं देख रहे हैं? यदि 'cellForRowAtIndexPath' नहीं कहा जा रहा है ... मुझे नहीं पता कि क्या हो रहा है। उस बिंदु पर, मैं एक कदम पीछे जाऊंगा और कॉल नंबर 'नंबरऑफरोइनसेक्शन' पर जाउंगा। किसी भी मामले में, मैं कह सकता हूं कि 'reloadData' करते समय प्रत्येक सेल सेल के लिए 'cellForRowAtIndexPath' _should_' कहा जा सकता है। – smparkes

+0

एनएसएलओजी कहते हैं कि जब मैं एक नई पंक्ति जोड़ता हूं, तो सब कुछ अपडेट हो जाता है; मेरी प्रारंभिक परिकल्पना गलत थी। किसी अन्य दृश्य नियंत्रक से तालिका दृश्य पर वापस लौटने पर reloadData को कॉल करते समय, कुछ भी नहीं कहा जाता है। –

0

भले ही आपके टेबलव्यू में 50 पंक्तियां हों, वहां केवल एक ही समय में दिखाई देने वाली कोशिकाओं के रूप में मौजूद होगा। ReuseIdentifier के पीछे यह पूरी कहानी है। तो 'सभी कोशिकाओं' को मजबूर करना मौजूद नहीं है। यदि कोई नया सेल प्रकट होता है, तो डेटा गतिशील रूप से लोड होता है।

सेल को बदलने का एकमात्र तरीका डेटा स्रोत विधि सेलफॉररएटइंडेक्सपैथ द्वारा वितरित डेटा को बदलना है।

+1

मैं अपने प्रश्न में गलत टाइप करता हूं; मैंने अब इसे अपडेट किया है। –

+0

और यदि आप 'reloadRowsAtIndexPaths को आजमाएं: RowAnimation: 'बस जांचने के लिए ... यह समाधान नहीं होने दें। – Jodocus

+0

यह भी काम नहीं करता है; इसका कोई प्रभाव नहीं है। –

0

if (cell == nil) ब्लॉक से अपना कोड न लें। इसके बजाय, आपके द्वारा बनाए जा रहे सेल के लिए प्रतिनिधि पहचानकर्ता बनाएं; कोशिश करें और सुनिश्चित करें कि सभी सेल की सामग्री पहचानकर्ता में निर्दिष्ट है। उदाहरण के लिए, यदि आपके पास 3 संख्याएं दिख रही हैं, तो सुनिश्चित करें कि उन तीनों नंबरों को पहचानकर्ता में एक अद्वितीय तरीके से रखना है जो केवल उस सेल को संदर्भित करेगा जिसमें ऐसी सामग्री है।

मान लें कि आपके पास कक्षा, array1, array2, और array3 में तीन एनएसएआरएआर गुण हैं जिनके पास NSNumber ऑब्जेक्ट्स के अंदर int मान लपेटे गए हैं। आप उन NSArrays उपयोग करने के लिए एक UITableView को भरने के लिए चाहते हैं, यह मुझे क्या करना चाहते हैं क्या है:

- (UITableViewCell *)tableView:(UITableView *)tableView 
        cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *identifier = [NSString stringWithFormat:@"%@-%@-%@", 
          [[array1 objectAtIndex:indexPath.row] intValue], 
          [[array2 objectAtIndex:indexPath.row] intValue], 
          [[array3 objectAtIndex:indexPath.row] intValue]]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 

    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] 
            initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:identifier] autorelease]; 

     //Build your cell here. 
    } 

    return cell; 
} 
1

मैं पाया है कि वर्गों को फिर से लोड डेटा पुन: लोड और अधिक आसानी से। आप बस एक खंड है, तो आप की कोशिश कर सकते हैं:

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

1

आप कोशिश कर सकते हैं इस

[tableView reloadData]; 

या

[tableView deleteRowsAtIndexPaths:[NSMutableArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade]; 

commitEditingStyle विधि में इस डाल दिया।

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