UITableViewCell, muestra el botón Eliminar al deslizar el dedo

Resuelto TheLearner asked hace 54 años • 19 respuestas

¿Cómo hago para que se muestre el botón Eliminar al deslizar el dedo sobre un archivo UITableViewCell? El evento nunca se genera y el botón Eliminar nunca aparece.

TheLearner avatar Jan 01 '70 08:01 TheLearner
Aceptado

Durante el inicio en (-viewDidLoad or in storyboard)do:

self.tableView.allowsMultipleSelectionDuringEditing = false

Anular para admitir la edición condicional de la vista de tabla. Esto solo debe implementarse si va a regresar NOpor algunos artículos. De forma predeterminada, todos los elementos son editables.

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return YES if you want the specified item to be editable.
    return YES;
}

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //add code here for when you hit delete
    }    
}
Kurbz avatar Jul 22 '2010 14:07 Kurbz

Esta respuesta se ha actualizado a Swift 3.

Siempre pienso que es bueno tener un ejemplo muy simple e independiente para que no se dé nada por sentado cuando estoy aprendiendo una nueva tarea. Esta respuesta es la de eliminar UITableViewfilas. El proyecto funciona así:

ingrese la descripción de la imagen aquí

Este proyecto se basa en el ejemplo UITableView para Swift .

Añade el código

Cree un nuevo proyecto y reemplace el código ViewController.swift con lo siguiente.

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    // These strings will be the data for the table view cells
    var animals: [String] = ["Horse", "Cow", "Camel", "Pig", "Sheep", "Goat"]

    let cellReuseIdentifier = "cell"

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // It is possible to do the following three things in the Interface Builder
        // rather than in code if you prefer.
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        tableView.delegate = self
        tableView.dataSource = self
    }

    // number of rows in table view
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.animals.count
    }

    // create a cell for each table view row
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!

        cell.textLabel?.text = self.animals[indexPath.row]

        return cell
    }

    // method to run when table view cell is tapped
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("You tapped cell number \(indexPath.row).")
    }

    // this method handles row deletion
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete {

            // remove the item from the data model
            animals.remove(at: indexPath.row)

            // delete the table view row
            tableView.deleteRows(at: [indexPath], with: .fade)

        } else if editingStyle == .insert {
            // Not used in our example, but if you were adding a new row, this is where you would do it.
        }
    }

}

El método de clave única en el código anterior que permite la eliminación de filas es el último. Aquí está nuevamente para enfatizar:

// this method handles row deletion
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {

        // remove the item from the data model
        animals.remove(at: indexPath.row)

        // delete the table view row
        tableView.deleteRows(at: [indexPath], with: .fade)

    } else if editingStyle == .insert {
        // Not used in our example, but if you were adding a new row, this is where you would do it.
    }
}

Guión gráfico

Agregue un UITableViewal controlador de vista en el guión gráfico. Utilice el diseño automático para fijar los cuatro lados de la vista de tabla a los bordes del Controlador de vista. Controle el arrastre desde la vista de tabla en el guión gráfico hasta la @IBOutlet var tableView: UITableView!línea del código.

Finalizado

Eso es todo. Debería poder ejecutar su aplicación ahora y eliminar filas deslizándose hacia la izquierda y tocando "Eliminar".


Variaciones

Cambiar el texto del botón "Eliminar"

ingrese la descripción de la imagen aquí

Agregue el siguiente método:

func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
    return "Erase"
}

Acciones de botones personalizados

ingrese la descripción de la imagen aquí

Agregue el siguiente método.

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

    // action one
    let editAction = UITableViewRowAction(style: .default, title: "Edit", handler: { (action, indexPath) in
        print("Edit tapped")
    })
    editAction.backgroundColor = UIColor.blue

    // action two
    let deleteAction = UITableViewRowAction(style: .default, title: "Delete", handler: { (action, indexPath) in
        print("Delete tapped")
    })
    deleteAction.backgroundColor = UIColor.red

    return [editAction, deleteAction]
}

Tenga en cuenta que esto solo está disponible desde iOS 8. Consulte esta respuesta para obtener más detalles.

Actualizado para iOS 11

Las acciones se pueden colocar al principio o al final de la celda usando métodos agregados a la API UITableViewDelegate en iOS 11.

func tableView(_ tableView: UITableView,
                leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
 {
     let editAction = UIContextualAction(style: .normal, title:  "Edit", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
             success(true)
         })
editAction.backgroundColor = .blue

         return UISwipeActionsConfiguration(actions: [editAction])
 }

 func tableView(_ tableView: UITableView,
                trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
 {
     let deleteAction = UIContextualAction(style: .normal, title:  "Delete", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
         success(true)
     })
     deleteAction.backgroundColor = .red

     return UISwipeActionsConfiguration(actions: [deleteAction])
 }

Otras lecturas

  • Cómo crear una celda de vista de tabla deslizable con acciones, sin volverse loco con las vistas de desplazamiento
  • Documentación
Suragch avatar Jun 09 '2016 07:06 Suragch

Este código muestra cómo implementar la eliminación.

#pragma mark - UITableViewDataSource

// Swipe to delete.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [_chats removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}

Opcionalmente, en su anulación de inicialización, agregue la siguiente línea para mostrar el elemento del botón Editar:

self.navigationItem.leftBarButtonItem = self.editButtonItem;
ma11hew28 avatar Nov 10 '2013 00:11 ma11hew28

Tuve un problema que acabo de resolver, así que lo comparto porque puede ayudar a alguien.

Tengo un UITableView y agregué los métodos que se muestran para permitir deslizar el dedo para eliminar:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return YES if you want the specified item to be editable.
    return YES;
}

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //add code here for when you hit delete
    }    
}

Estoy trabajando en una actualización que me permite poner la tabla en modo de edición y habilita la selección múltiple. Para hacerlo, agregué el código del ejemplo TableMultiSelect de Apple . Una vez que lo hice funcionar, descubrí que la función de borrar y deslizar el dedo había dejado de funcionar.

Resulta que el problema fue agregar la siguiente línea a viewDidLoad:

self.tableView.allowsMultipleSelectionDuringEditing = YES;

Con esta línea, la selección múltiple funcionaría pero deslizar el dedo para eliminar no. Sin la línea era al revés.

La solución:

Agregue el siguiente método a su viewController:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    self.tableView.allowsMultipleSelectionDuringEditing = editing; 
    [super setEditing:editing animated:animated];
}

Luego, en su método que pone la tabla en modo de edición (al presionar un botón, por ejemplo), debe usar:

[self setEditing:YES animated:YES];

en lugar de:

[self.tableView setEditing:YES animated:YES];

Esto significa que la selección múltiple solo está habilitada cuando la tabla está en modo de edición.

Leon avatar Oct 25 '2013 15:10 Leon

A continuación, UITableViewDataSource le ayudará a eliminar con el dedo.

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return YES if you want the specified item to be editable.
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [arrYears removeObjectAtIndex:indexPath.row];
        [tableView reloadData];
    }
}

arrYears es un NSMutableArray y luego recarga tableView

Rápido

 func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
            return true
        }

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == UITableViewCellEditingStyleDelete {
        arrYears.removeObjectAtIndex(indexPath.row)
        tableView.reloadData()
    }
}
iAnkit avatar Nov 26 '2014 07:11 iAnkit