2009-06-09 3 views
79

Desidero qualcosa di simile all'app Alarm, in cui non è possibile eliminare la riga, ma è comunque possibile eliminare la riga in modalità Modifica.UITableView disabilita il passaggio del mouse per eliminare, ma continua ad eliminare in modalità Modifica?

Quando commentato tableView: commitEditingStyle: forRowAtIndexPath :, ho disabilitato lo swipe da eliminare e avevo ancora il pulsante Elimina in modalità Modifica, ma cosa succede quando premo il pulsante Elimina. Cosa viene chiamato?

risposta

258

Ok, risulta piuttosto semplice. Questo è quello che ho fatto per risolvere questo:

Objective-C

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Detemine if it's in editing mode 
    if (self.tableView.editing) 
    { 
     return UITableViewCellEditingStyleDelete; 
    } 

    return UITableViewCellEditingStyleNone; 
} 

Swift 2

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle { 
    if tableView.editing { 
     return .Delete 
    } 

    return .None 
} 

Swift 3

override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle { 
    if tableView.isEditing { 
     return .delete 
    } 

    return .none 
} 

È ancora necessario implementare tableView:commitEditingStyle:forRowAtIndexPath: per confermare la cancellazione.

+0

bu poi scorrere per cancellare è automaticamente abilitato, di nuovo. O no? –

+0

No, scorrere per eliminare non viene abilitato, se non è in modalità di modifica. Ecco perché restituisco UITableViewCellEditingStyleNone come predefinito. – willi

+3

Hai dimenticato che hai bisogno di (editingStyle == UITableViewCellEditingStyleDelete) in commitEditingStyle: – willi

1

In sostanza, si abilita o disabilita la modifica utilizzando i metodi

- (void)setEditing:(BOOL)editing animated:(BOOL)animated 

Se la modifica è attivata, appare la cancellazione icona rossa, e una conformazione di eliminazione richiesta per l'utente. Se l'utente conferma, il metodo delegato

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 

viene notificato della richiesta di cancellazione. Se si implementa questo metodo, lo scorrimento per eliminare viene reso automaticamente attivo. Se non si implementa questo metodo, scorrere per eliminare non è attivo, tuttavia non è possibile eliminare effettivamente la riga. Pertanto, per quanto a mia conoscenza, non è possibile ottenere ciò che hai richiesto, a meno che non si utilizzino API private prive di documenti. Probabilmente è così che viene implementata l'applicazione Apple.

+1

ho risolto questo ritorno della UITableViewCellEditingStyleDelete in tableView: editingStyleForRowAtIndexPath: se è in modalità di modifica. – willi

8

Solo per chiarire le cose, lo scorrimento da eliminare non sarà abilitato a meno che non sia implementato lo tableView:commitEditingStyle:forRowAtIndexPath:.

Mentre ero in fase di sviluppo, non l'ho implementato, e quindi lo scorrimento da eliminare non è stato abilitato. Ovviamente, in un'app finita, sarebbe sempre implementata, altrimenti non ci sarebbero modifiche.

3

Swift Versione:

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle { 

    if(do something){ 

     return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert 

    } 
    return UITableViewCellEditingStyle.None 

}