2010-03-12 9 views

Respuesta

7

No he codificado esto, pero esta es la idea.

Crear selectionIndexPath en .h

NSIndexPath *selectionIndexPath; 

Luego, en .m

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

Guardar indexPath a selectionIndexPath y llame:

[self.tableView setEditing:YES]; 

Luego, en:

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

if (selectionPath.row == indexPath.row) 
    { 
     return UITableViewCellEditingStyleDelete; 
    } 
    else 
    { 
     return UITableViewCellEditingStyleNone;  
    } 
} 

También podría captar los toques y luego hacer más o menos lo mismo. Algo como esto ...

NSSet *touches = [event allTouches]; 
UITouch *touch = [touches anyObject]; 
CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; 
if (indexPath != nil) 
{ 
     // save indexPath and setEditing Mode here 
} 

No tenía tiempo para programarlo, pero esa es la idea principal.

+0

@Jordan, gracias, esta es la misma idea que tuve, pero crea un molesto parpadeo cuando la mesa entra en modo de edición y no se siente muy natural. Creo que la OP debe implementar el golpe-a-eliminar como Ian Henry sugiere o se adhieren a un enfoque más estándar. – DyingCactus

+0

También podría usar animación, pero estoy de acuerdo. – Jordan

+0

Gracias Jordan, parece que funciona. :) – msk

3

implementar el método editingStyleForRowAtIndexPath:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row == 3) 
    { 
     return UITableViewCellEditingStyleDelete; 
    } 
    else 
    { 
     return UITableViewCellEditingStyleNone;  
    } 
} 

// //

EDIT: Como se aclara en sus comentarios, desea que el golpe de usuario en una celda y luego eliminar o mover la celda.

Creo que para que el usuario haga ambas cosas, la tabla (no solo la celda) debe colocarse en modo de edición y si lo hace solo cuando el usuario desliza la celda, habrá un parpadeo molesto como la tabla se vuelve a dibujar para hacer espacio para los botones de inserción/eliminación. Jordan ha proporcionado un código de muestra para hacer esto.

La alternativa según lo sugerido por Ian Henry es implementar deslizar para borrar. Sin embargo, no parece haber un equivalente de deslizar para mover. Para implementar golpe-a-eliminar, haga lo siguiente:

  • mantener la edición de tablas en OFF
  • aplicar editingStyleForRowAtIndexPath y justo return UITableViewCellEditingStyleDelete independientemente de indexpath
  • aplicar willBeginEditingRowAtIndexPath pero no hacen nada en ella
  • aplicar commitEditingStyle y en ella eliminar fila de su fuente de datos y llamar a deleteRowsAtIndexPaths

Ahora cuando el usuario se desliza un cel l, un botón Eliminar aparecerá a la derecha. Si el usuario toca eso, se invocará commitEditingStyle y si el usuario toca algo más, se cancelará Delete.

+0

DyingCactus! Eso no hará el truco. Como eso solo establecería el modo de edición para la fila 3. Quiero establecer el modo de edición para la fila que el usuario pasó. – msk

+0

Ok, lo siento, malentendió su pregunta. Entonces, básicamente, ¿solo quieres poner la mesa en modo de edición cuando el usuario toca una celda? – DyingCactus

+0

Voy a agregar una posible manera más tarde hoy, pero ¿alguna de las aplicaciones de Apple hace esto? No estoy seguro de que siga el HIG. – DyingCactus

2

También hay un método -setEditing:animated: para UITableViewCell.Por lo tanto, si lo anula en una UITableViewCell personalizada y envía el mensaje a super solo si es editable, puede lograr lo que desea.

Para ser más claro. Subclase UITableViewCell y mantener un bool en él, dicen:

@interface CustomTableViewCell : UITableViewCell 
{ 
    BOOL cellEditable; 
} 
@property (readwrite, assign) BOOL cellEditable; 

@end 

A continuación, en el método de delegado tableview, devolver un objeto de CustomTabeViewCell con la propiedad cellEditable apropiadamente ajustado para la fila (si esa fila se puede editar o no).

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomTableViewCell *newCell = [[CustomTableViewCell alloc] init]; 
    if (row_is_editable) 
     [newCell setCellEditable:YES]; 
    else 
     [newCell setCellEditable:NO]; 
    return [newCell autorelease]; 
} 

De acuerdo con la documentación de - (void)setEditing:(BOOL)editing animated:(BOOL)animated método de UITableViewCell -

"Cuando se llama a este método con el valor del conjunto de edición en YES, y el objeto UITableViewCell está configurado para tener controles, la célula muestra una inserción (verde más) o control de eliminación (menos rojo) en el lado izquierdo de cada celda y un control de reordenamiento en el lado derecho. Este método se invoca en cada celda visible cuando se invoca el método setEditing: animado: UITableView. Llamar a este método con la edición establecida en NO, se eliminan los controles de la celda ".

Así que todo lo que tenemos que hacer es anular el -setEditing: animada: método en nuestra CustomTableViewCell y realizar esto:

-(void)setEditing:(BOOL)editing animated:(BOOL)animated 
{ 
    if ([self cellEditable]) 
    { 
     [super setEditing:editing 
       animated:animated]; 
    } 
    else 
    { 
     [super setEditing:NO 
       animated:NO]; 
    } 
} 

y ya está, ahora, cuando se dispara -setEditing:animated: en su vista de tabla, sólo el las filas cuyas celdas configuradas como cellEditable serán editables.

Cuestiones relacionadas