2009-08-23 5 views
5

Ich habe eine UITableView mit abwechselnd farbigen UITableViewCells. Und die Tabelle kann bearbeitet werden: Zeilen können neu geordnet und gelöscht werden. Wie aktualisiere ich die Hintergrundfarbe der Zellen, wenn die Zeilen neu geordnet oder gelöscht werden?Aktualisieren von abwechselnd farbigen UITableViewCells, wenn Zeilen neu geordnet oder gelöscht werden

ich dies mit den alternierenden gefärbten Zellen zu zeichnen:

- (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; 
    } 
} 

Aber diese Methode nicht aufgerufen wird, wenn eine Zeile neu angeordnet wird oder gelöscht. Und ich kann nicht [tableView reloadData] aus der folgenden Methode aufrufen, weil es die App in einer Endlosschleife stürzt:

- (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!! 
} 

Hat jemand einen Zeiger oder eine Best Practices-Lösung mit der Ausgabe von Neuordnen alternierende farbigen Zellen umgehen?

Dank

Antwort

5

eine verzögerte Aufruf verwendet, um die reload ausführen, wenn Sie nicht von dieser Methode aufrufen können:

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

Es wartet, bis nach der aktuellen Methode beendet ist, bevor es reload aufruft.

+0

Danke! Das macht den Trick. –

0

[Tableview reload] Ihre Tabellenhinter zurück in den Swing der Dinge bekommen. Ihre andere Option besteht darin, die Hintergrundfarben aller sichtbaren Zellen vom IndexPath des niedrigeren Index in der Bewegung bis zum höchsten in visibleCells zu vertauschen.

3

Reload ist zu schwer; Ich habe geschrieben AltTableViewController, dass nur Hintergrundfarbe der Zellen ändert und es sollte schneller arbeiten.

+0

Danke, das hat super funktioniert! –

1

Ich nahm alle UITableViewCell Subviews aus der Tabellenansicht und sortiert das Array basierend auf Zellen frame.origin.y, so dass sie wieder in der richtigen Reihenfolge waren. Dann habe ich die Hintergrundfarbe basierend auf dem Index == 0 || durchgeschliffen index% 2 == 0 sie neu einfärben. Scheint besser zu funktionieren als das tableView neu zu laden, da dies die Animation zum ruckeln brachte. Arbeitete für mich um 1:25 Uhr

4

Keine Notwendigkeit, Objekte von Drittanbietern zu verwenden oder die gesamte dataSource neu zu laden/aktualisieren. Verwenden Sie einfach die richtigen Werkzeuge in Ihrem Schweizer Messer:

- (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

'NSArray * indexPaths = [self.tableView indexPathsForVisibleRows];' speichert Sie aus einer unnötigen for-Schleife. – user3099609

0

Das funktioniert gut. Beginnen Sie das Muster beim letzten Index und nicht beim ersten. Auf diese Weise behält jede Zelle immer ihren Hintergrund bei:

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

Ich versuchte die anderen Lösungen, war aber nicht vollständig zufrieden. Diese Lösung ist kein Hack und fügt nicht einmal eine weitere Codezeile hinzu.

Verwandte Themen