2009-07-01 8 views
24

In meinem Tisch View-Controller ist esiPhone, Haken für edit/done Tastenklick in der Tabellenansicht

self.navigationItem.leftBarButtonItem = self.editButtonItem; 

, die in der linken oberen Ecke eine regulären bearbeiten/done Taste erzeugt. Sobald der Benutzer auf "Bearbeiten" klickt, ändert sich die Beschriftung der Schaltfläche zu "Fertig" und die Tabelleneinträge können gelöscht oder neu angeordnet werden. Ich möchte benachrichtigt werden, sobald der Benutzer auf "Fertig" klickt. Gibt es dafür einen Haken?

Hintergrund: Ich möchte die Reihenfolge der Einträge beibehalten, d. H. Wenn der Benutzer das nächste Mal diese Ansicht aufruft, möchte ich die Einträge in der Reihenfolge anzeigen, die zuletzt verwendet wurde.

Antwort

43

für diejenigen, die in dieser Frage noch interesed sind (oder beantworten: P)

UITableView API

ergab, dass es eine - (void)setEditing:(BOOL)editing animated:(BOOL)animate Methode Diese Methode wird jedes Mal aufgerufen, wenn diese Schaltfläche Bearbeiten/Fertig gedrückt wird. Sie müssen einfach mit dem (BOOL)editing Parameter überprüfen, welcher verwendet wurde. Zu guter Letzt müssen Sie die richtige Methode von der ursprünglich bearbeiteten Schaltfläche aufrufen.

einfach hinzufügen, um dieses Verfahren zu Ihrer UITableView Klasse

- (void)setEditing:(BOOL)editing animated:(BOOL)animate 
{ 
    [super setEditing:editing animated:animate]; 
    if(editing) 
    { 
     NSLog(@"editMode on"); 
    } 
    else 
    { 
     NSLog(@"Done leave editmode"); 
    } 
} 
+0

Denken Sie daran, dass setEditing: animated() auch aufgerufen wird, wenn irgendetwas die Ansicht programmatisch platziert Bearbeitungsmodus. Ich habe eine zusätzliche Methode hinzugefügt, die nur [super setEditing] aufruft, mit der ich den Bearbeitungsmodus extern einstellen kann. – Symmetric

+0

Hinweis: Wenn Sie dies über einen 'UIViewController' als' UITableView' ** Delegat ** tun, vergewissern Sie sich, dass 'UITableView' den Bearbeitungsstatus der ** Tabelle mit' [self.tableView setEditing] festlegt : Bearbeitung animiert: animiert] '. – cloudrave

2

Dies ist der normale Weg, informiert zu werden, wenn eine Bar-Taste gedrückt wurde:

self.editButtonItem.target = self; 
self.editButtonItem.action = @selector(buttonPushed:); 

... 

- (void) buttonPushed:(id)sender 
{ 
// do stuff here 
} 
+0

Nun, ich weiß das. Der Punkt ist, dass ich nicht mit dem interferieren möchte, was der Knopf bereits tut (Listeneinträge ändern, seine Beschriftung ändern, etc.). Ich würde einfach gerne wissen, wann es im Zustand "Done" geklickt wird. –

+1

UIBarButtonItems stammen nicht von UIControl, sodass Sie nicht einfach ein anderes Ziel hinzufügen können. Sie können die Aktion immer erfassen und den Status selbst beibehalten. Es ist nicht so schwer. Oder sonst, nimm den buttonPushed call (oben), setze dann ein 'ignore'-Flag und drehe um und synthetisiere ein einmaliges Ereignis zurück an der Taste, um es seine Sache machen zu lassen. Details zur Synthese von Berührungsereignissen finden Sie hier: http://cocoaithllove.com/2008/10/synthesizing-touch-event-on-iphone.html – Ramin

0

Es ist möglich, die Aktion zu ändern. Nach dem Klicken auf die Schaltfläche "Bearbeiten" wird die Schaltfläche "Löschen" angezeigt, stattdessen können Schaltflächen zum Zurückweisen/Verifizieren/Ändern angezeigt werden. Und statt Löschoption entsprechende Aktion ändern

Dank Mindus

3

Für diejenigen, die nicht wollen, UITableView außer Kraft zu setzen (zum Beispiel wenn Sie mit UITableViewController), hier ist eine einfache und saubere Lösung, die ich benutze. Es beinhaltet im Grunde die Erstellung Ihrer eigenen Edit-Schaltfläche Element und Verwendung der Tabelle editing Flag, um Edit vs Done zu verfolgen. Als Sahnehäubchen zeigt es einen "+" - Knopf (anstelle von "Bearbeiten"), wenn der Tisch leer ist, um neue Gegenstände hinzuzufügen.

- (void) updateEditButtonVisibility 
{ 
    // tableItems represents the data structure that s 
    if ([tableItems count] > 0) 
    { 
     UIBarButtonSystemItem editButtonType = self.tableView.editing ? UIBarButtonSystemItemDone : UIBarButtonSystemItemEdit; 
     UIBarButtonItem *editButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:editButtonType 
                         target:self 
                         action:@selector(editButtonTouched)]; 

     self.navigationItem.rightBarButtonItem = editButtonItem; 
     [editButtonItem release]; 
    } 
    else 
    { 
     UIBarButtonItem *addButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
                         target:self 
                         action:@selector(addButtonTouched)]; 
     self.navigationItem.rightBarButtonItem = addButtonItem; 
     [addButtonItem release]; 
    } 
} 

- (void) editButtonTouched 
{ 
    // edit/done button has been touched 

    [self.tableView setEditing:!self.tableView.editing animated:YES]; 
    [self updateEditButtonVisibility]; 
} 

- (void) addButtonTouched 
{ 
    // logic to allow user to add new items goes here 
} 

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

    [self updateEditButtonVisibility]; 
} 
Verwandte Themen