Pregunta ¿Cómo habilitar el deslizamiento para eliminar la celda en un TableView?


tengo un UIViewController que implementa el delegado y el origen de datos de TableViews protocolos. Ahora quiero agregar el gesto de "deslizar para eliminar" a las celdas.

¿Cómo debo hacerlo?

He dado una implementación en blanco de commitEditingStyle método y también establecer la propiedad de Edición a SÍ.

Aún así, la función de deslizar no viene.

Ahora necesito agregar por separado UISwipeGesture a cada célula?

O me estoy perdiendo algo ?


73
2018-01-24 06:59


origen


Respuestas:


No es necesario configurar editing:YES si necesita mostrar el botón Eliminar en el deslizamiento de la celda. Tienes que implementar tableView:canEditRowAtIndexPath: y devuelve SÍ desde allí para las filas que necesita editar / eliminar. Esto no es necesario cuando el dataSource de su tableView es una subclase de UITableViewContoller; este método, si no se reemplaza, devuelve YES por defecto. En todos los demás casos, debes implementarlo.

EDITAR: Juntos hemos encontrado el problema - tableView:editingStyleForRowAtIndexPath: devuelto UITableViewCellEditingStyleNone si la tabla no estaba en modo de edición.


53
2018-01-24 07:07



Como Dan ha comentado anteriormente, debe implementar los siguientes métodos delegados de vista de tabla:

  1. tableView:canEditRowAtIndexPath:
  2. tableView:commitEditingStyle:forRowAtIndexPath:

Nota: He intentado esto en iOS 6 e iOS 7.

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return YES - we will be able to delete all rows
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Perform the real delete action here. Note: you may need to check editing style
    //   if you do not perform delete only.
    NSLog(@"Deleted row.");
}

60
2017-10-07 09:20



// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not 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) {
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }   
}

25
2017-12-15 00:01



Por favor prueba este código rápidamente

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
   // let the controller to know that able to edit tableView's row 
   return true
}

override func tableView(tableView: UITableView, commitEditingStyle editingStyle UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)  {
   // if you want to apply with iOS 8 or earlier version you must add this function too. (just left in blank code)
}

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]?  {
   // add the action button you want to show when swiping on tableView's cell , in this case add the delete button.
   let deleteAction = UITableViewRowAction(style: .Default, title: "Delete", handler: { (action , indexPath) -> Void in

   // Your delete code here.....
   .........
   .........
   })

   // You can set its properties like normal button
   deleteAction.backgroundColor = UIColor.redColor()

   return [deleteAction]
}

13
2017-07-08 16:16



Intente agregar lo siguiente a su clase:

// Override to support conditional editing of the table view.
- (BOOL) tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return(YES);
}

5
2018-01-24 07:08



Conclusión de Kyr Dunenkoff el chat es

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {

}

no debe definirse si necesita que aparezca el botón Eliminar al deslizar.


3
2018-06-14 18:10



Esta es la versión rápida

// Override to support conditional editing of the table view.
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    // Return NO if you do not want the specified item to be editable.
    return true
}

// Override to support editing the table view.
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        // Delete the row from the data source
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    } else if editingStyle == .Insert {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }    
}

0
2018-05-06 09:22



Esto también fue un problema para mí ... Solo pude deslizar para eliminar para trabajar una vez cada 10 o más intentos. Resulta que gesture en el televisor estaba siendo bloqueado por otro gesto en el controlador de vista principal. La televisión estaba anidada en un MMDrawerController (deslice la disposición del cajón capaz).

Simplemente configurando el reconocedor de gestos en el controlador del cajón para no responder a los gestos cercanos en los cajones de flanqueo, pude deslizar para eliminar el trabajo en mi TV.

También puedes intentar hacer algo como esto con la gesture delegate:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

0
2018-05-06 22:13



En mi experiencia, parece que debes tener editing en UITableView ajustado a NO para pasar al trabajo.

self.tableView.editing = NO;


0
2018-06-09 16:17



Si estás usando un NSFetchedResultsControllerDelegate para poblar la vista de tabla, esto funcionó para mí:

  • Asegurarse tableView:canEditRowAtIndexPath devuelve verdadero siempre
  • En tus tableView:commitEditingStyle:forRowAtIndexPath implementación, no elimine la fila directamente de la vista de tabla. En su lugar, elimínelo utilizando su contexto de objeto gestionado, p. Ej .:

    if editingStyle == UITableViewCellEditingStyle.Delete {
        let word = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Word
        self.managedObjectContext.deleteObject(word)
        self.saveManagedObjectContext()
    }
    
    func saveManagedObjectContext() {
        do {
            try self.managedObjectContext.save()
        } catch {
            let saveError = error as NSError
            print("\(saveError), \(saveError.userInfo)")
        }
    }
    

0
2018-02-17 22:05