2011-06-15 16 views
6

I tiene un tableview que está siendo recargada como nuevo contenido, se añade, utilizando [tableview reloadData];recarga Tableview y tocar gestos

Trouble es que tengo una UILongPressGestureRecognizer en los TableCells en la tabla y porque las células/tabla se está recargando bastante a menudo, LongPress no siempre tiene tiempo para trabajar, supongo que los temporizadores internos se restablecen cuando se recarga la celda/tabla.

+0

¿Cuál es la frecuencia de las actualizaciones? –

+0

¿Qué tipo de cambios están sucediendo en las celdas? ¿Cambia toda la tabla, o solo una celda a la vez? – EmilioPelaez

+0

Las actualizaciones están sucediendo a menudo. – daidai

Respuesta

4

¿Ha intentado ver el estado de su UILongPressGestureRecognizer antes de llamar al [tableView reloadData]? Por ejemplo:

// Returns |YES| if a gesture recognizer began detecting a long tap gesture 
- (BOOL)longTapPossible { 
    BOOL possible = NO; 

    UIGestureRecognizer *gestureRecognizer = nil; 
    NSArray *visibleIndexPaths = [tableView indexPathsForVisibleRows]; 

    for (NSIndexPath *indexPath in visibleIndexPaths) { 
     // I suppose you have only one UILongPressGestureRecognizer per cell 
     gestureRecognizer = [[tableView cellForRowAtIndexPath:indexPath] gestureRecognizers] 
           lastObject]; 
     possible = (gestureRecognizer.state == UIGestureRecognizerStateBegan || 
        gestureRecognizer.state == UIGestureRecognizerStateChanged); 
     if (possible) { 
      break; 
     } 
    } 
    return possible; 
} 

// ... later, where you reload the tableView: 

if ([self longTapPossible] == NO) { 
    [tableView reloadData]; 
} 

¡Avísame si funciona!

+0

+1 para sugerir la inspección de 'UIGestureRecognizer.state' – Till

0

Establecer un BOOL como aCellIsSelected a SÍ cuando se toca la célula

y simplemente vuelve a cargar tableview si aCellIsSelected hay

+0

El problema con esto es que el UILongPressGestureRecognizer no se activa hasta que haya transcurrido un "largo" tiempo. Y no puedo escuchar el didSelectRowAtIndexPath ya que este es un toque y no es una imprenta, por lo que tampoco se llama. – daidai

+0

Puede subclasificar UITableViewCell y establecer el valor en setHighlighted – FoJjen

3

No utilice reloadData si desea que las células existentes permanezcan. En cambio, cuando obtiene datos nuevos, use los métodos para Inserting and Deleting Cells para informar a la vista de tabla exactamente qué celdas han cambiado. El procedimiento general es:

  1. Obtiene datos nuevos.
  2. llamada beginUpdates
  3. deleteRowsAtIndexPaths:withRowAnimation: llamada para eliminar las células de cualquier artículo de edad que han sido eliminados en los nuevos datos.
  4. Llame insertRowsAtIndexPaths:withRowAnimation: para agregar nuevas celdas para los elementos que se han agregado en los nuevos datos.
  5. Si necesita reemplazar selectivamente una celda en particular por alguna razón (y no puede simplemente actualizar las subvistas de la celda existente con los datos nuevos), use reloadRowsAtIndexPaths:withRowAnimation:.
  6. Llame commitUpdates. En este punto, sus métodos UITableViewDataSource deben reflejar los datos nuevos (por ejemplo, tableView:numberOfRowsInSection: debe reflejar el recuento modificado, y tableView:cellForRowAtIndexPath: debe usar los nuevos elementos).
  7. La vista de tabla ahora llamará a sus métodos de origen de datos según sea necesario para actualizar la pantalla. Las filas existentes no serán cambiadas.
+0

He intentado esta técnica en el pasado y encontré que el método reloadData era mucho mejor para mi sistema. ¿No hay forma de detectar si el usuario ha colocado un dedo en el dispositivo? – daidai

Cuestiones relacionadas