2009-08-23 3 views
5

मेरे पास वैकल्पिक रंगीन UITableViewCells के साथ UITableView है। और तालिका संपादित की जा सकती है: पंक्तियों को फिर से व्यवस्थित और हटाया जा सकता है। पंक्तियों को फिर से व्यवस्थित या हटाए जाने पर, मैं पृष्ठभूमि रंग को बदलने वाले कक्षों को कैसे अपडेट करूं?पंक्तियों को फिर से व्यवस्थित या हटाए जाने पर वैकल्पिक रंगीन UITableViewCells को अपडेट करना

मैं इस का उपयोग कर रहा बारी रंग कोशिकाओं आकर्षित करने के लिए:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ([indexPath row] % 2) { 
     // even row 
     cell.backgroundColor = evenColor; 
    } else { 
     // odd row 
     cell.backgroundColor = oddColor; 
    } 
} 

लेकिन जब एक पंक्ति पुनर्क्रमित या नष्ट कर दिया जाता है इस विधि नहीं बुलाया जा रहा है। और मैं निम्न विधि से [tableView reloadData] कॉल नहीं कर सकते, क्योंकि यह एक अनंत लूप में अनुप्रयोग क्रैश हो:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
    // Move the object in the array 
    id object = [[self.list objectAtIndex:[fromIndexPath row]] retain]; 
    [self.list removeObjectAtIndex:[fromIndexPath row]]; 
    [self.list insertObject:object atIndex:[toIndexPath row]]; 
    [object release]; 

    // Update the table ??? 
    [tableView reloadData]; // Crashes the app in an infinite loop!! 
} 

किसी को भी एक सूचक या एक सर्वोत्तम प्रथाओं बारी रंग कोशिकाओं को पुन: क्रम के मुद्दे से निपटने का हल है?

धन्यवाद

उत्तर

5

एक देरी कॉल प्रयुक्त पुनः लोड प्रदर्शन करने के लिए यदि आप उस विधि से फोन नहीं कर सकते हैं:

[tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.0f]; 

यह जब तक इससे पहले कि यह फिर से लोड कॉल अपने वर्तमान पद्धति समाप्त हो गया है के बाद इंतजार कर रहा है।

+0

धन्यवाद! वह चाल है। –

0

[tableView reloadData] अपनी मेज पृष्ठभूमि चीजों के झूले में वापस मिल जाएगा। आपका दूसरा विकल्प दृश्यमानों में उच्चतम तक की चाल में निचले इंडेक्स के इंडेक्सपाथ से सभी दृश्यमान कक्षों के पृष्ठभूमि रंगों को स्वैप करना है।

3

रीलोड बहुत भारी वजन है; मैंने AltTableViewController लिखा है जो केवल कोशिकाओं के पृष्ठभूमि रंग को बदलता है और इसे तेज़ी से काम करना चाहिए।

+0

धन्यवाद, यह बहुत अच्छा काम किया! –

1

मैंने टेबल्यूव्यू से सभी UITableViewCell सबव्यूज़ को लिया और उस सरणी को सेल फ्रेम.ऑरिगिन.ई पर आधारित किया ताकि वे उचित क्रम में वापस आ सकें। फिर मैं सूचकांक == 0 || के आधार पर पृष्ठभूमि रंग बदलने के माध्यम से looped इंडेक्स% 2 == 0 उन्हें फिर से रंगना। तालिका को पुनः लोड करने से बेहतर काम करने लगता है क्योंकि एनीमेशन को झटका लग रहा था। 1:25 पूर्वाह्न

4

पर मेरे लिए काम किया तीसरे पक्ष की वस्तुओं का उपयोग करने या पूरे डेटा स्रोत को फिर से लोड/रीफ्रेश करने की आवश्यकता नहीं है। बस अपने स्विस चाकू में सही उपकरण का उपयोग करें:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if(editingStyle == UITableViewCellEditingStyleDelete) { 
     //1. remove your object 
     [dataSource removeObjectAtIndex:indexPath.row]; 

     //2. update your UI accordingly 
     [self.myTableView beginUpdates]; 
     [self.myTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight]; 
     [self.myTableView endUpdates]; 

     //3. obtain the whole cells (ie. the visible ones) influenced by changes 
     NSArray *cellsNeedsUpdate = [myTableView visibleCells]; 
     NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; 
     for(UITableViewCell *aCell in cellsNeedsUpdate) { 
      [indexPaths addObject:[myTableView indexPathForCell:aCell]]; 
     } 

     //4. ask your tableview to reload them (and only them) 
     [self.myTableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; 

    } 
} 
+1

'एनएसएआरएआरई * इंडेक्सपाथ = [self.tableView indexPathsForVisibleRows]; 'आपको लूप के लिए अनावश्यक से बचाता है। – user3099609

0

यह अच्छा काम करता है। पहले की तुलना में अंतिम सूचकांक में पैटर्न शुरू करें। इस तरह प्रत्येक सेल हमेशा इसकी पृष्ठभूमि को बरकरार रखता है:

if (dataSource.count - indexPath.row) % 2 == 0 { 
     cell.backgroundColor = UIColor.grayColor() 
    } else { 
     cell.backgroundColor = UIColor.whiteColor() 
    } 

मैंने अन्य समाधानों की कोशिश की, लेकिन पूरी तरह से संतुष्ट नहीं था। यह समाधान एक हैक नहीं है और कोड की एक और पंक्ति भी नहीं जोड़ता है।