2010-04-14 15 views
24

Establecí mi altura de fila UITableView en Interface Builder en 54.0. Tengo un UISearchDisplayController en esa vista. Cuando el usuario toca la barra de búsqueda, la tabla cambia de tamaño correctamente. Sin embargo, cuando comienzan a escribir (y en realidad hacen la búsqueda) la altura de la fila disminuye. Permanece mal hasta que la búsqueda toca Cancelar.UISearchDisplayController cambio de altura de fila

No pude encontrar documentación sobre este comportamiento en el sitio de Apple.

He intentado configurar la altura de la fila en UISearchDisplayDelegate llamadas de delegado. Este podría ser el enfoque correcto, pero no conozco los detalles y no pude hacerlo funcionar.

También intenté implementar - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;. Esto funcionó, pero tengo miles de entradas en esta lista y no puedo tomar el golpe de rendimiento.

¿Cuál es la forma correcta de arreglar esto?

+0

Animo a todos a echar un vistazo a la respuesta de steven a continuación. La suya es la única respuesta que a) sigue el protocolo 'UITableViewDataSource', tratando el' UISearchTableView' como cualquier otra tabla y b) Admite más de una altura para las filas. B es bastante importante si tiene la funcionalidad estándar para mostrar una celda personalizada de "sin resultados de búsqueda" que generalmente se dimensionará para tomar todo el marco de tableView. – memmons

+0

Dudo que sea cierto. Encontré la implementación de 'heightForRowAtIndexPath' en mi caso, fue lento para mi tabla (que tenía decenas de miles de filas). Asegúrese de no devolver una altura variable solo para ciertos parámetros 'tableView' y debería estar bien. –

+0

'heightForRowAtIndexPath' nunca debería tener un impacto significativo en el rendimiento de' tableView'. Ya sea que tenga 10 filas o 10.000 filas, el tableView solo trata con las filas visibles actualmente. Por lo tanto, a menos que esté tardando una cantidad considerable de tiempo para determinar cuál debe ser la altura de fila, su tableView debería ser capaz de mantener una animación de 60 fps al desplazarse. – memmons

Respuesta

55

La forma correcta de hacerlo es usar el siguiente delegado.

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView 
{ 
    tableView.rowHeight = 54.0f; // or some other height 
} 

Se llama cuando se crea o se muestra UITableView.

Si llama al searchDisplayController.searchResultsTableView en otro código cuando no se realiza una búsqueda, se creará la UITableView por adelantado. Si utiliza el método de delegado willShow para establecer rowHeight, perderá el tiempo (por algún motivo) para cambiar el rowHeight si el tableView se ha creado de antemano.

+0

Me avergüenza cuántas veces he tenido que mover la respuesta aceptada aquí, pero obviamente estás en lo cierto. Gracias. –

+0

Gracias , Funciona. –

0

Es necesario configurar tanto

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {  
    return 54.; 
} 

y

self.tableView.rowHeight = 54.; 

también en su UISearchDisplayDelegate

- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView { 
    tableView.rowHeight = 54.; 
} 

De lo contrario, cuando "n Resultado" ocurrió en la búsqueda, altura de la celda caerá volver al predeterminado.

+0

En realidad, heightForRowAtIndexPath: and .rowHeight se comporta de forma un poco diferente (al menos en su caso), así que asegúrese de configurar ambos, no solo uno de ellos. – digdog

+0

No puedo usar heightForRowAtIndexPath. Con 20,000 filas, ralentiza el tabla demasiado en un dispositivo real –

16

¡Lo encontré!

Suponiendo que la tabla se almacena en tableView:

- (void)viewDidLoad; 
{ 
    [super viewDidLoad]; 
    self.searchDisplayController.searchResultsTableView.rowHeight = tableView.rowHeight; 
} 

Nada más es necesario.

Editar: Vea la respuesta de netmikey para una mejor solución.

10

Steve, su solución no funcionó: la primera vez que el resultado de búsqueda se mostraba bien, pero cuando un usuario estaba presionando "Cancelar" (cerrando la barra de búsqueda) y luego volviendo a abrirlo e ingresando un término de búsqueda en él, la altura sería incorrecta de nuevo.

La solución de DigDog de usar searchDisplayController:didShowSearchResultsTableView estaba funcionando, pero los usuarios vieron la altura de la celda "saltando" cuando comenzó la búsqueda.

La solución que encontré, que fija estos dos problemas es el uso de:

- (void)searchDisplayController: (UISearchDisplayController *)controller 
willShowSearchResultsTableView: (UITableView *)searchTableView { 

    searchTableView.rowHeight = myTableView.rowHeight; 
} 

... en el UISearchDisplayDelegate.

Saludos, netmikey

+0

Esa es una respuesta mejor. Aceptado :) –

-1

Ninguna de las soluciones que funcionó para mí ...

que hizo mi propio éxito y el juicio ... y tengo trabajo ...

Si usted quiere diverso alturas de fila para normal & tabla de búsqueda visitas ...

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
// for normal results 
    if (tableView==self.tableView) return 54; 
// for search results 
    else return 54; } 

Y si quieres altura común ...

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return 54; } 

PS: Se debe tener presente, si tiene misma altura de la fila para cada fila, este método no es muy eficiente el uso de recursos sabia, ya que la altura de la fila se vuelve a calcular para cada celda ... Aunque, esto es imperceptible en la mayoría de los casos, ¡todavía estoy buscando una solución mejor!

1

Anulando el método didLoadSearchResultsTableView debería hacer el truco.

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView { 
    tableView.rowHeight = 82.0; // Change height of search result row 
} 

Más explicaciones a this blog

3

En viewDidLoad:

puede establecer el delegado del controlador de pantalla de búsqueda de uno mismo:

- (void)viewDidLoad 
{ 
    self.searchDisplayController.delegate = self; 
} 

A continuación, aplicar la tabla vista delegado en su opinión controlador:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (tableview == self.searchDisplayController.tableView) { 
     return 55; 
    } else if (tableView == self.tableView) { 
     return 44; 
    } 
} 
+0

No puedo +1 suficiente. Esta es la única respuesta que a) sigue el protocolo 'UITableViewDataSource', tratando el' UISearchTableView' como cualquier otra tabla y b) Admite más de una altura para las filas. B es bastante importante si tiene la funcionalidad estándar para mostrar una celda personalizada de "sin resultados de búsqueda" que generalmente se dimensionará para tomar el marco completo de tableView. – memmons

0

He estado usando ios 7.0 y Xcode 5.0. Creo que debería cambiar remas altura en este método:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    { 
    // Return the number of rows in the section. 
    if (tableView == self.searchDisplayController.searchResultsTableView) 
    { 
     tableView.rowHeight = ...;// change your row height here! 
     return [self.searchResults count]; 
    } 
    else 
    { 
     ... 
     return ...; 
    } 
    } 

Debido a que cada vez que un intento tableview para mostrar su diseño, este método se llama, por lo que cada vez que escriba una carta en la barra de búsqueda, este método se llama, y la altura de la fila no tendrá la posibilidad de cambiar.

Cuestiones relacionadas