UITableView disabilita lo scorrimento per eliminare, ma è ancora necessario eliminare in modalità di modifica?


91

Voglio qualcosa di simile all'app Sveglia, in cui non puoi scorrere per eliminare la riga, ma puoi comunque eliminare la riga in modalità Modifica.

Quando è stato commentato tableView: commitEditingStyle: forRowAtIndexPath :, ho disabilitato lo scorrimento per eliminare e avevo ancora il pulsante Elimina in modalità Modifica, ma cosa succede quando premo il pulsante Elimina. Come viene chiamato?

Risposte:


286

Ok, risulta essere abbastanza facile. Questo è quello che ho fatto per risolvere questo problema:

Obiettivo-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 eseguire il commit dell'eliminazione.


bu quindi scorrere per eliminare viene automaticamente abilitato, di nuovo. O no?
Massimo Cafaro

No, scorri per eliminare non viene abilitato, se non è in modalità di modifica. Ecco perché restituisco UITableViewCellEditingStyleNone come impostazione predefinita.
Willi

3
Hai dimenticato di menzionare che hai bisogno di if (editingStyle == UITableViewCellEditingStyleDelete) in commitEditingStyle:
willi

Ok, con questa affermazione hai un'azione di eliminazione ma ha una visualizzazione diversa. C'è qualche possibilità di avere quell'azione con la stessa visuale della versione a scorrimento?
Göktuğ Aral

@giuseppe Non importa. Non ha torto riferendosi al sé. Quel metodo delegato fa riferimento allo stesso tableView, quindi è possibile utilizzare o.
Stephen Paul

9

Giusto per chiarire le cose, il passaggio del dito per eliminare non sarà abilitato a meno che non tableView:commitEditingStyle:forRowAtIndexPath:sia implementato.

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


4

Versione rapida:

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

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}

3

È necessario implementare la funzione CanEditRowAt.

Puoi restituire .delete nella funzione EditingStyleForRowAt in modo da poter ancora eliminare in modalità di modifica.

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    if tableView.isEditing {
        return true
    }
    return false
}

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
    return .delete
}

2

Fondamentalmente, abiliti o disabiliti la modifica utilizzando i metodi

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

Se la modifica è abilitata, viene visualizzata l'icona di eliminazione rossa e una conferma di eliminazione richiesta all'utente. Se l'utente conferma, il metodo delegato

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

viene informato della richiesta di cancellazione. Se si implementa questo metodo, lo scorrimento per eliminare viene attivato automaticamente. Se non si implementa questo metodo, lo scorrimento per eliminare non è attivo, tuttavia non è possibile eliminare effettivamente la riga. Pertanto, per quanto ne so, non puoi ottenere ciò che hai richiesto, a meno che non utilizzi alcune API private non documentate. Probabilmente è così che viene implementata l'applicazione Apple.


1
Ho risolto questo problema restituendo UITableViewCellEditingStyleDelete in tableView: editingStyleForRowAtIndexPath: se è in modalità di modifica.
Willi

0

In C #:

Ho avuto lo stesso problema in cui era necessario abilitare / disabilitare le righe con l'opzione Elimina allo scorrimento. Più righe dovevano essere strisciate a sinistra e cancellate, mantenendole in un altro colore. Ho ottenuto utilizzando questa logica.

[Export("tableView:canEditRowAtIndexPath:")]
public bool CanEditRow(UITableView tableView, NSIndexPath indexPath)
{

    if (deletedIndexes.Contains(indexPath.Row)){
        return false;
    }
    else{
        return true;
    }

}

Notare che deletedIndexes è un elenco di indici che vengono eliminati dalla tabella senza duplicati. Questo codice controlla se una riga viene eliminata, quindi disabilita lo scorrimento o viceversa.

La funzione delegato equivalente è Swift canEditRowAtIndexPath.


0

Mi sono imbattuto in questo problema e l'ho risolto con i codici seguenti. spero che ti possa aiutare.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {

    BOOL deleteBySwipe = NO;
    for (UIGestureRecognizer* g in tableView.gestureRecognizers) {
        if (g.state == UIGestureRecognizerStateEnded) {
            deleteBySwipe = YES;
            break;
        }
    }

    if (deleteBySwipe) {
        //this gesture may cause delete unintendedly
        return;
    }
    //do delete
}

}

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.