2013-02-19 46 views
8

तो मेरे पास UITableView है जो एक वीडियो लाइब्रेरी का प्रतिनिधित्व करता है। लाइब्रेरी का डेटास्रोत NSMutableDictionary है जिसमें इसकी प्रत्येक कुंजी के लिए NSMutableArray है। प्रत्येक Arrays में प्रत्येक मान के लिए सभी जानकारी के साथ एक ऐरे होता है।पंक्ति को सम्मिलित करना और एक साथ पंक्ति को हटाना। UITableView

NSMutableDictionary -> Foreach Key NSMutableArray जिसमें - NSMutableArrays शामिल है।

tableSectionData मेरा डेटा स्रोत है।

मैं पहले खंड पर एक पंक्ति डालने की कोशिश कर रहा हूं और किसी अन्य अनुभाग में एक और पंक्ति हटा रहा हूं। यह वह कोड है जिसका मैं उपयोग कर रहा हूं:

EDIT यह नया प्रयास है। मैं पहले डेटास्रोत को अद्यतन करता हूं और फिर संबंधित डेटा को जोड़ता हूं और हटाता हूं जो मेरे डेटा स्रोत से अनुक्रमित होता है।

[mainTableView beginUpdates]; 
    NSMutableDictionary *clone = [[NSMutableDictionary alloc] 
          initWithDictionary:self.tableSectionData copyItems:YES]; 
    for (NSString *key in [clone allKeys]) { 
     if([key isEqualToString:@"Videos available for download"]) { 
      for (NSArray *videoArray in [clone objectForKey:key]) { 
       if ([[videoArray objectAtIndex:0] isEqualToString:helper.videoName]) { 
        [[self.tableSectionData objectForKey:@"Downloaded videos"] 
               addObject:videoArray]; 
        NSUInteger insertIndex = [[self.tableSectionData 
               objectForKey:@"Downloaded videos"] 
                 indexOfObject:videoArray]; 
        NSIndexPath *pathToInsert = [NSIndexPath 
             indexPathForRow:insertIndex inSection:0]; 
        NSArray *indexesToAddition = [NSArray 
                arrayWithObject:pathToInsert]; 
        [mainTableView insertRowsAtIndexPaths:indexesToAddition 
            withRowAnimation:UITableViewRowAnimationFade]; 
        [[self.tableSectionData 
      objectForKey:@"Videos available for download"] removeObject:videoArray]; 
        NSUInteger deleteIndex = [[self.tableSectionData 
     objectForKey:@"Videos available for download"] indexOfObject:videoArray]; 
        NSIndexPath *pathToDelete = [NSIndexPath 
             indexPathForRow:deleteIndex inSection:1]; 
        NSArray *indexesToDeletion = [NSArray arrayWithObject: 
                    pathToDelete]; 
        [mainTableView deleteRowsAtIndexPaths:indexesToDeletion 
            withRowAnimation:UITableViewRowAnimationFade]; 

       } 
      } 
     } 
    } 
    [mainTableView endUpdates]; 

मुझे लगा कि यह काम करेगा, क्योंकि मैं पहली बार एक पंक्ति को हटाना होगा अगर मैं एक सम्मिलित करना चाहते हैं (इस मामले में मैं दोनों करना चाहते हैं।)

विशिष्ट त्रुटि निम्नलिखित है:

'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (4) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).' 

मुझे पता है कि त्रुटि क्या कहती है, कि मेरे पास अनुभाग पर पंक्तियों की एक समान संख्या नहीं है, हालांकि मुझे कोड पर मेरी गलती नहीं दिखाई देती है और मैंने डेटा स्रोत को लॉग किया है और यह वांछित परिणाम से मेल खाता है।

कोई भी मदद और सुझावों की बहुत सराहना की जाएगी!

उत्तर

-3

मुझे लगता है कि आप UITableView हर बार जब आप डालने या numberOfRowsInSection में पंक्तियों की सही संख्या लौटने के साथ हुई पंक्तियां हटाना फिर से लोड करने की आवश्यकता है ...

+0

मैं पहले से ही इस कोशिश की, लेकिन बात नहीं बनी। मैं शुरुआत और अंत अद्यतनों के साथ रहना होगा! – Joze

9

आप के अंदर शुरू/अंत अपडेट तरीकों सभी अद्यतन करना है। यदि आपके पास एक से अधिक UITableView अद्यतन हैं तो यह हमेशा मान्य है।

और अपडेट डेटा को न भूलें एंड्रॉइड से पहले अद्यतन स्रोत!

[self.tableView beginUpdates]; 

    // do your staff here, like: 
[self.tableView inserRowsAtIndexPaths:indexPathsToInsert]; 
[self.tableView deleteRowsAtIndexPaths:indexPathsToDelete]; 

[self.tableView endUpdates]; 

यहाँ अपनी गलती - आप अपने कोड नमूने में विभिन्न शुरू/अंत अपडेट वर्गों का उपयोग कर रहे है

+0

कोड की टिप्पणियों के अनुसार मैं पहले से ही कहता हूं कि मैंने पहले ही यह कोशिश की है इसलिए मैंने इसे अलग-अलग वर्गों पर करने की कोशिश की। तो यह समस्या नहीं है। इसके अलावा, insertRowsAtIndexPaths को DeleteRowsAtIndexPaths के बाद होना चाहिए या यह प्रलेखन के अनुसार और परीक्षणों के अनुसार काम नहीं करेगा जो मैंने पहले ही किया है। वैसे भी आपके सुझाव के लिए धन्यवाद। – Joze

4

जहाँ आपके डेटा स्रोत है?

से पहले हटाने

[dataSource removeObjectAtIndex:nIndexDelete]; 
[mainTableView deleteRowsAtIndexPaths:indexesToDeletion 
            withRowAnimation:UITableViewRowAnimationFade]; 

से पहले जोड़ने

[dataSource inserObject:object atIndex:nIndexAdd]; 
[mainTableView insertRowsAtIndexPaths:indexesToAddition 
             withRowAnimation:UITableViewRowAnimationFade]; 
+0

अरे धन्यवाद, मैंने पहले ही यह किया है (या संभवतः मैं इसे गलत कर रहा हूं) पहले डेटा को देखें जहां मैं अपने डेटा स्रोत के क्लोन के माध्यम से पुन: प्रयास करता हूं। मेरा डेटा स्रोत टेबलसेक्शनडेटा है, वहां मैं वस्तुओं को प्रश्न में जोड़ता हूं और हटा देता हूं। मैं जो करने की कोशिश कर रहा हूं वह किसी सेक्शन की एक पंक्ति को दूसरे खंड में स्थानांतरित कर रहा है। मुझे अपने कोड में गलती नहीं दिखाई दे रही है ... – Joze

+0

क्या मुझे पता है कि आप विधि में किस कोड का उपयोग करते हैं ** संख्याऑफसेक्शन इनटेबल व्यू: ** और ** टेबल व्यू: संख्याऑफ्रोइन्स इनसेक्शन: **? –

+0

मुझे पता है कि UITableViewDelegate के उन हिस्सों में सही हैं, यह उस क्रम के मुद्दे का अधिक है जिसमें अपडेट कहा जा रहा है। reloadData विधि मेरे लिए काम करती है लेकिन मुझे अभी भी समझ में नहीं आता है कि क्यों सम्मिलित करें और हटाएं काम नहीं करते हैं। अद्यतन प्रश्न देखें। – Joze