¿UITableView deshabilita el deslizamiento para eliminar, pero aún tiene eliminar en el modo de edición?

91

Quiero algo similar a la aplicación Alarm, donde no puede deslizar el dedo para eliminar la fila, pero aún puede eliminar la fila en el modo de edición.

Cuando se comentó tableView: commitEditingStyle: forRowAtIndexPath :, desactivé el deslizamiento para eliminar y todavía tenía el botón Eliminar en el modo de edición, pero ¿qué sucede cuando presiono el botón Eliminar? ¿Qué se llama?

Willi
fuente

Respuestas:

286

Ok, resulta bastante fácil. Esto es lo que hice para resolver esto:

C objetivo

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

Aún necesita implementar tableView:commitEditingStyle:forRowAtIndexPath:para confirmar la eliminación.

Willi
fuente
bu luego deslizar para eliminar se habilita automáticamente, nuevamente. ¿O no?
Massimo Cafaro
No, deslizar para eliminar no se habilita si no está en modo de edición. Es por eso que devuelvo UITableViewCellEditingStyleNone como predeterminado.
Willi
3
Olvidé mencionar que necesita if (publishingStyle == UITableViewCellEditingStyleDelete) en commitEditingStyle:
willi
Ok, con esta declaración obtuviste la acción de eliminar pero tiene una visualidad diferente. ¿Hay alguna posibilidad de tener esa acción con la misma visualidad de la versión deslizante?
Göktuğ Aral
@giuseppe No importa. No se equivoca al referirse al yo. Ese método delegado se refiere al mismo tableView, por lo que está bien usar o.
Stephen Paul
9

Solo para aclarar las cosas, deslizar para eliminar no se habilitará a menos que tableView:commitEditingStyle:forRowAtIndexPath:se implemente.

Mientras estaba en desarrollo, no lo implementé y, por lo tanto, deslizar para eliminar no estaba habilitado. Por supuesto, en una aplicación terminada, siempre se implementaría, porque de lo contrario no habría edición.

Marc Rochkind
fuente
4

Versión rápida:

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

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}
Kareem
fuente
3

Necesita implementar la función CanEditRowAt.

Puede devolver .delete en la función EditingStyleForRowAt para que aún pueda eliminar en el modo de edición.

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
}
Noodybrank
fuente
2

Básicamente, habilitas o deshabilitas la edición usando los métodos

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

Si la edición está habilitada, aparece el icono de eliminación rojo y se solicita al usuario una confirmación de eliminación. Si el usuario confirma, el método delegado

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

es notificado de la solicitud de eliminación. Si implementa este método, deslizar para eliminar se activa automáticamente. Si no implementa este método, deslizar para eliminar no está activo, sin embargo, no puede eliminar la fila. Por lo tanto, a mi leal saber y entender, no puede lograr lo que solicitó, a menos que utilice algunas API privadas no documentadas. Probablemente así es como se implementa la aplicación de Apple.

Massimo Cafaro
fuente
1
Resolví esto devolviendo UITableViewCellEditingStyleDelete en tableView: editStyleForRowAtIndexPath: si está en modo de edición.
Willi
0

En C #:

Tuve el mismo problema en el que se necesitaba habilitar / deshabilitar filas con la opción Eliminar al deslizar. Es necesario deslizar varias filas hacia la izquierda y eliminarlas, manténgalas en otro color. Logré usando esta lógica.

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

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

}

Tenga en cuenta que los DeleteIndexes son una lista de índices que se eliminan de la tabla sin duplicados. Este código verifica si se elimina una fila, luego deshabilita el deslizamiento o viceversa.

La función de delegado equivalente es Swift is canEditRowAtIndexPath.

AG
fuente
0

Me encontré con este problema y lo solucioné con los códigos a continuación. Espero que te ayude.

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

}

user4272677
fuente