UIActionSheet para eliminar una celda UITableView al cancelar sigue mostrando el button Eliminar presionado

Al eliminar una fila en una vista de tabla, quiero mostrar una hoja de acción pidiendo confirmación en ciertas situaciones. Cuando la hoja de acción se responde con "Sí" (la acción destructiva), elimino la fila de la tabla y todo está bien. Pero cuando se pulsa Cancelar, todavía veo el button Eliminar en un estado presionado.

Lo que hago en tableView:commitEditingStyle al eliminar es:

 BlockBasedActionSheet *askSheet = [[BlockBasedActionSheet alloc] initWithTitle:@"Delete entry?" cancelButtonTitle:@"No" destructiveButtonTitle:@"Yes, delete child also records" cancelAction:^{ UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; if (cell.showingDeleteConfirmation) { cell.editing = NO; cell.editingAccessoryView = nil; cell.editing = YES; } } destructiveAction:deleteBlock]; [askSheet showInView:self.view]; [askSheet release]; 

Lo que también es extraño es que la propiedad de la showingDeleteConfirmation muestra showingDeleteConfirmation es NO , aunque el button Eliminar todavía está visible.

Estoy usando una implementación de hoja de acción basada en bloques hecha por mi count. Tal vez se encuentra el error, aunque parezco get la celda correcta en el bloque de cancelación.

Entonces, ¿cómo puedo restablecer el estado del button Eliminar a "sin presionar" y eliminarlo, y volver el button de eliminación circular a horizontal, como sucede cuando toco en algún lugar de la pantalla?

Clase de ayudante BlockBasedActionSheet.h :

 @interface BlockBasedActionSheet : UIActionSheet<UIActionSheetDelegate> { } @property (copy) void (^cancelBlock)(); @property (copy) void (^destructiveBlock)(); - (id)initWithTitle:(NSString *)title cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSString *)destructiveButtonTitle cancelAction:(void (^)())cancelBlock destructiveAction:(void (^)())destructiveBlock; @end 

Archivo de implementación BlockBasedActionSheet.m :

 #import "BlockBasedActionSheet.h" @implementation BlockBasedActionSheet @synthesize cancelBlock = _cancelBlock, destructiveBlock = _destructiveBlock; - (id)initWithTitle:(NSString *)title cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSString *)destructiveButtonTitle cancelAction:(void (^)())cancelBlock destructiveAction:(void (^)())destructiveBlock { self = [super initWithTitle:title delegate:self cancelButtonTitle:cancelButtonTitle destructiveButtonTitle:destructiveButtonTitle otherButtonTitles: nil]; if (self) { _cancelBlock = Block_copy(cancelBlock); _destructiveBlock = Block_copy(destructiveBlock); } return self; } -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { NSAssert(actionSheet == self, @"Wrong Action Sheet passed"); if (buttonIndex == [self cancelButtonIndex]) { if (self.cancelBlock) { self.cancelBlock(); } } else { if (self.destructiveBlock) { self.destructiveBlock(); } } } @end 

Entonces, funciona reemplazando el primer fragment de código con esto

 BlockBasedActionSheet *askSheet = [[BlockBasedActionSheet alloc] initWithTitle:@"Delete entry?" cancelButtonTitle:@"No" destructiveButtonTitle:@"Yes, delete also child records" cancelAction:^{ // this resets the delete button [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; } destructiveAction:deleteBlock]; [askSheet showInView:self.view]; [askSheet release]; 

Recargar la fila hace el truco.

De la documentation para tableView:commitEditingStyle : No debe llamar a setEditing: animated: dentro de una implementación de este método. Si por alguna razón usted debe, invocarlo después de un retraso usando el performSelector: withObject: afterDelay: method.

Mi entendimiento es que este método se llama una vez que el button de eliminación comienza a desaparecer (por showingDeleteConfirmation tanto, showingDeleteConfirmation es NO ) y por lo tanto, no se llamará a las cosas dentro de su instrucción if dentro de su bloque. Si estableces un punto de interrupción, ¿estoy en lo cierto?

En cualquier caso, es posible que desee hacer lo que dice la documentation y hacer que la tabla regrese al modo de edición después de un retraso de milisegundos.

editar / actualizar

Creado un nuevo proyecto basado en navigation en Xcode. Cambió este código. Establezca la tabla para mostrar 10 filas con cada fila que muestre su ruta de índice como el text. http://dl.dropbox.com/u/2180315/crazycell.zip si quieres todo el asunto. Tendrás que deslizar para eliminar, no hice un button de eliminación dedicado.

Llamar a setEditing en el object de celda no hace nada, incluso si se usa performSelector... (no sé por qué). Pero puedes llamar a setEditing en la tableView que, en la medida de lo que puedo decir, hace lo que quieres que haga (lo lleva de vuelta a los icons de eliminación horizontal, sin button de eliminación).

Si esto no resuelve tu problema, entonces realmente no estoy seguro de qué más se puede hacer: /

 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { BlockBasedActionSheet *askSheet = [[BlockBasedActionSheet alloc] initWithTitle:@"Delete entry?" cancelButtonTitle:@"No" destructiveButtonTitle:@"Yes, delete child also records" cancelAction:^{ [self.tableView setEditing:YES animated:YES]; } destructiveAction:^{ NSLog(@"Delete block called"); }]; [askSheet showInView:self.view]; [askSheet release]; }