2009-07-01 3 views
24

Nel mio controller vista tabella c'èiPhone, gancio per la modifica/fatto clic del pulsante nella vista tabella

self.navigationItem.leftBarButtonItem = self.editButtonItem; 

che produce un pulsante regolare modificare/fatto nell'angolo in alto a sinistra. Quindi, una volta che l'utente fa clic su "Modifica", la didascalia cambia in "Fatto" e le voci della tabella possono essere cancellate o riordinate. Vorrei ricevere una notifica una volta che l'utente ha effettivamente fatto clic su "Fatto". C'è un gancio per questo?

Contesto: vorrei mantenere l'ordine delle voci, ad esempio la prossima volta che l'utente apre questa visualizzazione, vorrei presentare le voci nell'ordine meno recente utilizzato.

risposta

43

per coloro che sono ancora interessati di questa domanda (o rispondere: P)

UITableView API

ha rivelato che esiste un metodo che viene chiamato ogni volta che si preme questo pulsante di modifica/fine. devi semplicemente verificare con il parametro (BOOL)editing che è stato utilizzato. per ultimo, ma non meno importante, devi chiamare il metodo corretto dal pulsante di modifica/completamento originale.

semplicemente aggiungere questo metodo per la classe UITableView

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

Ricorda che setEditing: animato() viene chiamato anche se qualcosa mette a livello di programmazione la vista in modalità Modifica. Ho aggiunto un metodo aggiuntivo che chiama solo [super setEditing] che posso usare per impostare esternamente la modalità di modifica. – Symmetric

+0

Nota: Se stai facendo questo attraverso un 'UIViewController' come un delegato' UITableView' **, assicurati di dire a 'UITableView' di impostare lo ** stato di modifica ** della tabella con' [self.tableView setEditing : modifica animata: animata] '. – cloudrave

2

Questo è il modo standard per essere avvisato quando un pulsante della barra è stato premuto:

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

... 

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

Beh, lo so. Il punto è che non voglio interferire con ciò che il pulsante già fa (modificare le voci dell'elenco, attivare la didascalia, ecc.). Vorrei semplicemente sapere quando viene cliccato nel suo stato "Fatto". –

+1

UIBarButtonItems non deriva da UIControl, quindi non è possibile aggiungerne un altro. Puoi sempre catturare l'azione e mantenere lo stato te stesso. Non è così difficile. Oppure, ottieni la chiamata buttonPushed (sopra) quindi imposta un flag 'ignore' e gira intorno e sintetizza un evento singolo al pulsante per lasciargli fare il suo effetto. Dettagli sulla sintetizzazione degli eventi di tocco qui: http://cocoawithlove.com/2008/10/synthesizing-touch-event-on-iphone.html – Ramin

0

E 'possibile modificare l'azione. Dopo aver fatto clic sul pulsante di modifica, viene visualizzato il pulsante Elimina, invece è possibile visualizzare i pulsanti Rifiuta/Verifica/Modifica. E cambiare azione corrispondente al posto di opzione di eliminazione

Grazie Mindus

3

Per coloro che non vogliono ignorare UITableView (ad esempio, se si sta utilizzando UITableViewController), ecco una soluzione semplice e pulita che uso. Fondamentalmente implica la creazione della propria voce di pulsante di modifica e l'utilizzo del flagdi TableView per tenere traccia delle modifiche e delle operazioni eseguite. Per la ciliegina sulla torta, mostra un pulsante "+" (invece di "Modifica") quando il tavolo è vuoto per aggiungere nuovi elementi.

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