UITableViewCell, muestra el botón Eliminar al deslizar el dedo
¿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.
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 NO
por 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
}
}
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 UITableView
filas. El proyecto funciona así:
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 UITableView
al 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"
Agregue el siguiente método:
func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
return "Erase"
}
Acciones de botones personalizados
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
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;
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.
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()
}
}