Scorri per eliminare e il pulsante "Altro" (come nell'app Mail su iOS 7)


246

Come creare un pulsante "altro" quando l'utente scorre una cella nella vista tabella (come l'app di posta in iOS 7)

Ho cercato queste informazioni sia qui che nel forum Cocoa Touch, ma non riesco a trovare la risposta e spero che qualcuno più intelligente di me stesso possa darmi una soluzione.

Mi piacerebbe che quando l'utente scorresse una cella della vista tabella, visualizzasse più di un pulsante di modifica (il suo valore predefinito è il pulsante Elimina). Nell'app Mail per iOS 7 puoi scorrere per eliminare, ma è presente un pulsante "ALTRO" che viene visualizzato.

inserisci qui la descrizione dell'immagine



Per aggiungere il pulsante "Elimina" implemento le seguenti due funzioni. - (BOOL) tableView: (UITableView *) tableView canEditRowAtIndexPath: (NSIndexPath *) indexPath; - (void) tableView: (UITableView *) tableView commitEditingStyle: (UITableViewCellEditingStyle) editingStyle forRowAtIndexPath: (NSIndexPath *) indexPath; E voglio aggiungere il pulsante "Altro" accanto ad esso.
Guy Kahlon il

3
@MonishBansal Bansal Sembra che qualcuno in questo thread ( devforums.apple.com/message/860459#860459 nel forum degli sviluppatori Apple) sia andato avanti e abbia costruito la propria implementazione. Puoi trovare un progetto che fa quello che vuoi su GitHub: github.com/daria-kopaliani/DAContextMenuTableViewController
Guy Kahlon

8
@GuyKahlonMatrix grazie per la soluzione che funziona come un fascino. Questa domanda è il risultato numero 1 in molte ricerche su Google e le persone sono costrette a scambiare le proprie conoscenze usando i commenti perché alcuni ragazzi hanno deciso che è più utile chiudere la domanda e predicare la democrazia. Questo posto ha chiaramente bisogno di mod migliori.
Şafak Gezer,

2
Se riesci a scegliere come target iOS 8, la mia risposta di seguito sarà quella che desideri.
Johnny,

Risposte:


126

Come implementare

Sembra che iOS 8 apra questa API. Suggerimenti di tale funzionalità sono presenti in Beta 2.

Per far funzionare qualcosa, implementa i seguenti due metodi sul delegato di UITableView per ottenere l'effetto desiderato (vedi gist per un esempio).

- tableView:editActionsForRowAtIndexPath:
- tableView:commitEditingStyle:forRowAtIndexPath:


Problemi noti

La documentazione dice tableView: commitEditingStyle: forRowAtIndexPath è:

"Non chiamato per le azioni di modifica usando UITableViewRowAction - verrà invece invocato il gestore dell'azione."

Tuttavia, lo scorrimento non funziona senza di essa. Anche se lo stub del metodo è vuoto, ne ha ancora bisogno, per ora. Questo è ovviamente un bug in beta 2.


fonti

https://twitter.com/marksands/status/481642991745265664 https://gist.github.com/marksands/76558707f583dbb8f870

Risposta originale: https://stackoverflow.com/a/24540538/870028


Aggiornare:

Codice di esempio con questo funzionamento (In Swift): http://dropbox.com/s/0fvxosft2mq2v5m/DeleteRowExampleSwift.zip

Il codice di esempio contiene questo metodo facile da seguire in MasterViewController.swift e solo con questo metodo si ottiene il comportamento mostrato nella schermata OP:

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]? {

    var moreRowAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "More", handler:{action, indexpath in
        println("MORE•ACTION");
    });
    moreRowAction.backgroundColor = UIColor(red: 0.298, green: 0.851, blue: 0.3922, alpha: 1.0);

    var deleteRowAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete", handler:{action, indexpath in
        println("DELETE•ACTION");
    });

    return [deleteRowAction, moreRowAction];
}

1
Questo sembra essere corretto, ma in Xcode 6 GM il gesto di scorrimento non sembra funzionare. È possibile accedere a editActions impostando la vista tabella in modalità di modifica. Qualcun altro ha scoperto che il colpo non funziona?
Siegfoult,

@Siegfoult Hai provato a implementare (anche se lasciato vuoto) tableView: commitEditingStyle: forRowAtIndexPath :?
Johnny,

Non ho lavorato nell'obiettivo c .. Stesso codice che ho scritto. si prega di suggerire alcuni suggerimenti.
Solid Soft

@SolidSoft Hai un progetto di esempio che potrei guardare? Potrei essere in grado di aiutare meglio in questo modo.
Johnny,

3
Per rispondere al mio commento. Chiami tableView.editing = false( NOin objc) e la cella si "chiuderà".
Ben Lachman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.