versiones guia ios uitableview uiswipegesturerecognizer

ios - guia - qgis manual



¿Cómo habilitar el deslizamiento para eliminar la celda en un TableView? (13)

Tengo un UIViewController que implementa delegados de TableViews y protocolos de fuente de datos . Ahora quiero agregar el gesto de "deslizar para eliminar" a las celdas.

¿Cómo debo hacerlo?

He dado una implementación en blanco del método commitEditingStyle y también establecí la propiedad de edición en YES.

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

Ahora ¿Necesito agregar UISwipeGesture por UISwipeGesture a cada celda?

O me estoy perdiendo algo ?


Como Dan comentó 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."); }


Después de iOS 8.0, puede personalizar su acción en

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath


En mi experiencia, parece que debes tener la editing en UITableView establecida en NO para deslizar para que funcione.

self.tableView.editing = NO;


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


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 el gesture en el televisor estaba siendo bloqueado por otro gesto en el controlador de vista padre. El televisor estaba anidado en un MMDrawerController (deslice el diseño del cajón).

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 el gesture delegate :

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


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); }


La conclusión del chat de es

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

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


No tiene que establecer la 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 necesites 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.

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


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


Puede ver todos los métodos necesarios creando una clase UITableViewController (temporal) en XCode 5 y luego copie qué método le gustaría usar. Esos métodos que necesita serán comentados con líneas previamente rellenas que desee.


Si está utilizando un NSFetchedResultsControllerDelegate para llenar la vista de tabla, esto funcionó para mí:

  • Asegúrese de que tableView:canEditRowAtIndexPath devuelva verdadero siempre
  • En la tableView:commitEditingStyle:forRowAtIndexPath , no elimine la fila directamente de la vista de tabla. En su lugar, elimínelo utilizando su contexto de objeto administrado, por ejemplo:

    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)") } }


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


NSMutableArray *post= [NSMutableArray alloc]initWithObject:@"1",@"2",@"3",nil]; - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { NSUInteger row = [indexPath row]; NSUInteger count = [posts count]; if (row < count) { return UITableViewCellEditingStyleDelete; } else { return UITableViewCellEditingStyleNone; } } - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { NSUInteger row = [indexPath row]; NSUInteger count = [posts count]; if (row < count) { [posts removeObjectAtIndex:row]; } }