2012-04-04 18 views
4

Ich habe versucht, zwischen Bearbeitungszuständen in meinem UITableView zu unterscheiden.Unterscheiden zwischen Bearbeitungsstadien UITableView?

Ich brauche eine Methode nur im Bearbeitungsmodus nach dem Tippen auf die Schaltfläche Bearbeiten, so wenn Sie Ihre Zelle einschieben und Sie sehen die kleinen kreisförmigen Symbole löschen, aber nicht, wenn der Benutzer zum Löschen wischt.

Gibt es überhaupt eine Unterscheidung zwischen den beiden?

Danke.

EDIT:

Lösung dank Rodrigo

Sowohl jede Zelle und die gesamte tableview hat einen ‚Editieren‘ BOOL-Wert, so dass ich eine Schleife durch alle Zellen, und wenn mehr als eine von ihnen ist die Bearbeitung dann Wir wissen, dass die ganze Tabelle ist (der Benutzer tippte auf den Edit-Button), aber wenn nur einer editiert wird, dann wissen wir, dass der Benutzer eine Zelle gekippt hat und diese individuell bearbeitet hat. So kann ich jeden Bearbeitungszustand einzeln bearbeiten!

- (void)setEditing:(BOOL)editing animated:(BOOL)animated 
{ 
    [super setEditing:editing animated:animated]; 


    int i = 0; 
    //When editing loop through cells and hide status image so it doesn't block delete controls. Fade back in when done editing. 
    for (customGuestCell *cell in self.tableView.visibleCells) 
    { 
     if (cell.isEditing) { 
      i += 1; 
     } 
    } 

    if (i > 1) 
    { 
     for (customGuestCell *cell in self.tableView.visibleCells) 
     { 
      if (editing) 
      { 
       // loop through the visible cells and animate their imageViews 
       [UIView beginAnimations:nil context:nil]; 
       [UIView setAnimationDuration:0.4]; 
       cell.statusImg.alpha = 0; 
       [UIView commitAnimations]; 
      } 
     } 
    } 
    else if (!editing) 
    { 
     for (customGuestCell *cell in self.tableView.visibleCells) 
     { 
      [UIView beginAnimations:nil context:nil]; 
      [UIView setAnimationDuration:0.4]; 
      cell.statusImg.alpha = 1.0; 
      [UIView commitAnimations];    
     } 
    } 
} 
+0

IMHO das funktioniert nicht: Im regulären Bearbeitungsmodus (alle Zellen editierbar), dann die erste Zelle denkt, es ist in "swipe on delete mode". – obiwahn

Antwort

3

Es gibt eine Strategie, ich teste jetzt nicht, aber vielleicht funktioniert.

Sie können festlegen, dass sich UITableView im Bearbeitungsmodus befindet und mit der Funktion isEditing testen. Aber die Zelle hat die gleiche isEditing. So können Sie prüfen, ob sich nur eine Zelle im Bearbeitungszustand oder das gesamte UITableView befindet.

Überprüfen Sie, ob das UITableView überhaupt in den Bearbeitungsstatus wechselt, wenn Sie eine Zelle in den Bearbeitungszustand versetzen.

+0

Ahh, wirklich nette Idee, aber ich habe es versucht und habe es nicht geschafft, es auf diese Weise funktionieren zu lassen. –

+0

Diese Lösung funktioniert, danke! Ich habe geschrieben, wie ich es in meinem OP geschafft habe. –

1

Der einzige zuverlässige Weg, den ich gefunden habe, um dies zu tun, ist eine private Flagge inEditMode zu pflegen und dieses Flag in setEditing:animated umschalten. Verwenden Sie dann inEditMode anstelle von isEditing, um zu überprüfen, ob sich die Tabelle im Bearbeitungsmodus befindet oder nicht.

+0

Entschuldigung, es gibt nicht sehr viele Informationen hier, danke für die Antwort, und könnten Sie bitte erweitern? Wie genau verwenden Sie Ihre 'inEditMode' BOOL, um die Bearbeitungsmodi zu unterscheiden? –

+1

Im Gegensatz zu 'isEditing' ist dieser' inEditMode' * nur * 'YES', wenn die Tabelle" wirklich "im Bearbeitungsmodus ist (dh nicht durch eine einzelne Wischaktion). – edsko

2

Die Lösung, die ich wählte, war, die Aktion für die Bearbeitungsschaltfläche auf eine benutzerdefinierte Methode zu überschreiben, sagen wir editBtnTapped. In dieser Methode setze ich eine Variable editButtonPressed, und rufen Sie dann, da wir die Aktion der Bearbeitungsschaltfläche überschreiben, manuell setEditing: animated :.

In viewDidLoad:

[self.navigationItem.rightBarButtonItem setAction:@selector(editBtnPressed)]; 

Und dann wird der neue Aktionsmethode:

- (IBAction) editBtnPressed 
{ 
    if ([self isEditing]) 
    { 
    self.editButtonPressed = NO; 
    [self setEditing:NO animated:YES]; 
    } 
    else 
    { 
    self.editButtonPressed = YES; 
    [self setEditing:YES animated:YES]; 
    } 
} 

Jetzt in setEditing: animated: Ich überprüfe das editButtonPressed Flagge, um festzustellen, ob ich wegen einer dort bin Bearbeiten-Taste drücken oder einen einfachen Benutzer streichen. Wenn ich aufgrund der Bearbeiten-Schaltfläche dort bin, füge ich die Zelle hinzu; sonst tue ich nicht.

Beachten Sie, dass Sie das Flag möglicherweise woanders benötigen (z. B. numberOfRowsInSection).

Hoffe, diese Alternative hilft.

Grüße,

--John

4

Auch wenn dieser Beitrag schon recht alt ist, wird die folgende könnte hilfreich sein für andere:

Wenn Sie die folgenden Delegierten Nachrichten implementieren: - (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath;

und

- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath;

Diese Methoden werden beim Editieren einer einzelnen Zeile aufgerufen. -[UIViewController setEditing:animated:] wird dann nur aufgerufen, wenn der Benutzer die Bearbeitungsschaltfläche berührt.

Verwandte Themen