2009-11-21 17 views
12

Para mi aplicación de iPhone, tengo una vista de tabla editable (para eliminar). Me gustaría poder detectar que el usuario ha hecho clic en el botón "Editar". Ver esta imagen: http://grab.by/It0Cómo detectar el modo de edición en el iPhone UITableView

A partir de los documentos, se veía como si he implementado:

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath 

entonces podría detectarlo (aunque desde el nombre del método, no pensaría eso). Esto probó no funcionar.

¿Alguna idea sobre detectar esto? La razón por la que quiero es que quiero conectar un botón "Eliminar todo" en la esquina superior izquierda cuando esté en el modo de eliminación.

gracias

Respuesta

19

probablemente no funcionan como se esperaba debido a willBeginEditingRowAtIndexPath: se llama antes de las aperturas de edición.

Si desea comprobar mientras que en otro método que necesita la propiedad editing:

@property(nonatomic, getter=isEditing) BOOL editing 

Si usted quiere hacer algo cuando se pulsa el botón 'Editar' que necesita para poner en práctica el método setEditing:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated 

Que usted encontrará en UIViewController. (Bueno, ese es el lugar más probable; hay otros.)

+0

(void) setEditing: (BOOL) de edición de animación: (BOOL) animada {[setEditing súper: la modificación de animación: animación].; } para el botón de edición retiene su acción esperada. –

3

Este método le indica cuando un usuario está editando una Celda, no pone la tabla en modo de edición. Hay un método llamado cuando se entra en el modo de edición, para preguntar si cada celda se puede editar:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 

no creo anulando setEditing:animated: tiene sentido, ya que tendría una subclase UITableView que es un trabajo extra y una clase que necesita sin ninguna otra razón, sin mencionar que tendría que comunicar el hecho de que la edición había sido activada nuevamente en el controlador.

Otra opción es simplemente agregar el botón Editar ti mismo - es construido en un UIBarButtonSystemItem, lo puedes añadir y luego tener que llamar a su propio método en el que se hace algo específico, entonces llamar setEditing:animated: en el UITableView sí.

La idea detrás de la edición es que cuando se habilita la edición, se indica a cada celda que pase al modo de edición, y se le pregunta si hay algún control de edición específico que deba aplicarse. En teoría, no es necesario detectar la entrada en el modo de edición más allá de cambiar la apariencia de las celdas. ¿Qué intenta hacer cuando se ingresa al modo de edición?

+0

setEditing se encuentra en UITableViewController, que probablemente ya haya subclasificado, no en la tabla misma. En cuanto a una razón por la que podría querer hacer esto, digamos que el usuario puede reordenar las filas, pero no desea comprometer este reordenamiento al servidor web hasta que todo esté listo. – Nathan

13

Cuando se subclasifica un tableviewcontroller (lo que la mayoría de las personas van a hacer la mayoría de las veces ya que tiene que anular sus métodos de delegado solo para poner datos en él ...) puede anular el método setEditing: animado: agarrar cambios de estado de edición.

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { 
    NSLog(@"Editing %i", editing); 
    [super setEditing:editing animated:animated]; 
} 

que pasa el cambio de estado a lo largo de la superclase, pero le permite saltar en el medio y detectar el cambio, o modificarla si quería ...

+1

[super setEditing: edición animada: animada]; es necesario para que el botón de edición conserve su acción esperada. –

3

obras respuesta Kendall 's. Lo hice de la siguiente manera.

// 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. 
    NSLog(@"Can edit %d", tableView.editing); 
    if (tableView.editing == 1) { 
     [self.editButtonItem setTitle:EDIT_BUTTON_TITLE]; 
    }else { 
     [self.editButtonItem setTitle:DONE_BUTTON_TITLE]; 
    } 

    return YES; 
} 
3

El setEditing: animada: ejemplos no funcionó para mí (en IOS 6.1) para detectar los cambios de estado que se producen al entrar y salir al modo de eliminación de confirmación. Parece que setEditing: animated: solo se llama una vez, cuando la vista de tabla entra en modo de edición, pero no en los cambios de estado de las celdas. Después de un poco de depuración, llegué a un método para detectar el cambio de estado de la celda.

Mi caso de uso es diferente al tuyo. Solo quería ocultar la etiqueta cuando se muestra el botón Eliminar para que el contenido de la otra celda no se superponga cuando se desliza el botón Eliminar. (Estoy usando UITableViewCellStyleValue2, el que tiene la etiqueta azul a la izquierda y la etiqueta negra a la derecha)

(en la subclase UITableViewCell)

- (void)willTransitionToState:(UITableViewCellStateMask)state { 
    [super willTransitionToState:state]; 
    if (state & UITableViewCellStateShowingDeleteConfirmationMask) { 
     // showing delete button 
     [self.textLabel setAlpha:0.0f]; // <-- I just wanted to hide the label 
    } 
} 

- (void)didTransitionToState:(UITableViewCellStateMask)state { 
    if (!(state & UITableViewCellStateShowingDeleteConfirmationMask)) { 
     // not showing delete button 
     [self.textLabel setAlpha:1.0f]; // <-- show the label 
    } 
} 
Cuestiones relacionadas