2011-05-23 84 views
10

Tengo una UITableView y quiero poder reordenar las filas cuando no estoy en modo de edición, lo que significa que no quiero ver los iconos de eliminación hasta que presione Editar. Quiero poder ver y usar los controles de reordenamiento todo el tiempo. ¿Es eso posible?¿Reordenar controles en UITableView mientras no está en modo de edición?

¿Debo mantener UITableView en modo de edición todo el tiempo y activar/desactivar el ícono de borrar manualmente? ¿Cómo deshabilitar el deslizamiento para eliminar en ese caso?

+0

Establezca el indicador UITableViewCellEditingStyle en cada celda e implemente los métodos de delegado canMoveRowAtIndexPath y canEditRowAtIndexPath UITableViewDataSource. No estoy seguro de si tiene que estar en el modo de edición de forma permanente para hacer esto. – TheBlack

Respuesta

7

Que yo sepa, no se puede usar solo con el indicador de edición. Sin embargo, no es difícil lograr un efecto similar.

Tiene su propia booleana, es decir, deleting. Establezca la celda de vista de tabla en cell.showsReorderControl = YES. Luego, implemente todos los métodos requeridos para mover las celdas. El bit de código que creo que estás buscando es. – tableView:editingStyleForRowAtIndexPath: if deleting == YES return UITableViewCellEditingStyleDelete de lo contrario devolver UITableViewCellEditingStyleNone. Por último, configure tableView.editing = YES siempre. Si antes y después de cambiar el deleting bool ejecuta [tableView beginUpdates] y [tableView endUpdates] todo debería funcionar bien. Avíseme si esto no tiene sentido, y lo intentaré de nuevo.

+5

por la forma en que esto dejará de deslizar para eliminar. – mackross

+0

Me gustó esto. Funcionó bien. Sin embargo, no estoy usando el deslizamiento para eliminar en esto. – Shades

+0

he intentado pero todavía tengo necesidad de poner en práctica: ** tableview.editing = SI; ** y muestra el botón rojo para eliminar .. Deseo simplemente volver a ordenar las células sin ningún tipo de función de edición. ... puede proporcionar algún código de muestra a: [email protected] –

7

Reordenar sin borrado y sin indentación.

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
    return YES; 
} 

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

- (BOOL)tableView:(UITableView *)tableview shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath { 
    return NO; 
} 


- (BOOL)tableView:(UITableView *)tableview canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
    return YES; 
} 

Referencia: Solución publicado por Stefan von Chossy here

+0

También es necesario implementar 'moveRowAt: to ::' de lo contrario, los controles de reordenamiento no se muestran. – Matt

9

he encontrado una solución. UITableViewCell se niega a dibujar el control de reorden a menos que esté en modo de edición. Afortunadamente, UITableViewCell y UITableView rastrean la edición por separado, y lo más importante, UITableView realmente maneja el reordenamiento independientemente de su propio modo de edición. Solo tenemos que engañar a las células para que dibujen los controles de reorden y estamos en casa libres.

Subclase UITableViewCell así:

class ReorderTableViewCell: UITableViewCell { 

    override var showsReorderControl: Bool { 
     get { 
      return true // short-circuit to on 
     } 
     set { } 
    } 

    override func setEditing(editing: Bool, animated: Bool) { 
     if editing == false { 
      return // ignore any attempts to turn it off 
     } 

     super.setEditing(editing, animated: animated) 
    } 

} 

Ahora basta con establecer editing = true en celdas para las que desee habilitar reordenamiento. Puede hacerlo condicional en -tableView:canMoveRowAtIndexPath:.

En su tabla de origen vista de datos:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 

    // Configure the cell... 
    : 

    cell.editing = self.tableView(tableView, canMoveRowAtIndexPath: indexPath) // conditionally enable reordering 

    return cell 
} 

El único inconveniente es que esto es incompatible con la vista de tabla allowsMultipleSelectionDuringEditing opción; el control de edición siempre se muestra de forma incorrecta. Una solución alternativa es habilitar la selección múltiple solo durante la edición de la vista de tabla real.

En su controlador de vista de tabla:

override func setEditing(editing: Bool, animated: Bool) { 
    super.setEditing(editing, animated: animated) 

    self.tableView.allowsMultipleSelectionDuringEditing = editing // enable only during actual editing to avoid cosmetic problem 
} 

También, en -viewDidLoad o su guión gráfico, establecer el valor inicial de allowsMultipleSelectionDuringEditing a falso.

+0

Esta solución funciona para mí, ¡Gracias! – sebastien

+0

Genius. He estado a través de soluciones de 10+ SO para esto y este es el único que funciona. Tendrá que vigilar esto con futuros lanzamientos de iOS, pero funciona bien en iOS 10.1 – Tys

Cuestiones relacionadas