2010-04-21 10 views
12

Tengo una configuración estándar UITableView + UISearchDisplayController + UITableViewIndex. Todo funciona como un campeón.UITableViewIndex crece a límites incorrectos inesperadamente

Excepto que, bajo condiciones muy específicas, el índice crece demasiado tiempo para mostrarse en la pantalla. Específicamente, después de finalizar una búsqueda y volver a mostrar la tabla indexada no filtrada, el índice a veces crece demasiado tiempo.

Más específicamente, esto no ocurre si busco y luego cancelo. Solo sucede si busco, luego presiono un controlador de vista desde la tabla de búsqueda, y luego vuelvo a mostrar ese controlador de vista a la tabla de búsqueda inmóvil, luego cancelo la búsqueda, luego vuelve a buscar y luego cancelo esa búsqueda final. Después del final de la búsqueda final, el índice es demasiado largo.

En vertical, la vista de tabla informa una altura de 416 y el índice una altura de 404 en condiciones normales. Si registro desde searchDisplayControllerDidEndSearch cuando el índice tiene un tamaño incorrecto, está informando una altura de 620.

He intentado todo desde setLayout en la tabla y el índice para cambiar manualmente el tamaño del marco. No funciona nada (el cambio de tamaño manual ocasiona que se registre la altura correcta, pero no cambia la visualización en pantalla).

estaba a punto de tratar redimensionamiento después de un retraso en el caso de la animación cancelar estaba interfiriendo, pero luego me di cuenta de lo que una situación absurda que estoy en pensamiento y buscando ayuda podría ser prudente ...

+0

¿Cómo está construyendo su índice? ¿Está construido en viewWillAppear? – gnasher

+0

¿Está ejecutando algún tipo de tarea en segundo plano (sincrónico), puede bloquear el comportamiento correcto de la interfaz de usuario en algunas circunstancias excepcionales? – elslooo

+0

Es posible que desee comprobar y ver si tiene ajuste de tamaño automático en su vista. – fjlksahfob

Respuesta

1

Si todavía tiene problemas, puede intentar establecer un punto de inflexión simbólico en - [UITableView setFrame:] y rastrear de dónde viene la llamada de marco establecida. HTH

+0

(o posiblemente - [UITableView setBounds:]) – nielsbot

0

Mi situación era un poco diferente de la publicada, pero encontré una solución que funciona en mi caso, así que espero que en la publicada aquí.

Tengo un UITableView que utiliza un control de resultados fetched y carga más elementos de un servidor cuando se llega al final de tableView. Al realizar una búsqueda, fetchedResultsController se filtra y carga más entradas del servidor cuando no hay suficiente para mostrar.

Cuando la conexión devuelve sus resultados (después de presionar "buscar"), estoy recargando tableViews (el original y el searchResultsTableView). Ahora cuando cancelas la búsqueda y todo vuelve a la normalidad, experimento el problema de la pregunta. El UITableViewIndex crece a sus límites inesperados.

Dado que también experimenté que el UITableView redimensionó para ser mucho más grande de lo esperado, jugué una corazonada y funcionó para mí. En la subclase UITableView (esto es ARC/6.1):

- (void)loadView 
{ 
    [super loadView]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    if (self.isSearching) 
    { 
     // Ensure the correct height of the original tableview while displaying the searchresults-tableview 
     // only this will make sure, the height of the UITableViewIndex is set correctly ... 
     [UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^(){ 
      CGRect rect = self.tableView.frame; 
      rect.size.height -= [self.tableView convertRect:[[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil].size.height; 
      self.tableView.frame = rect; 
     }]; 
    } 
} 

- (void)keyboardWillHide:(NSNotification *)notification 
{ 
    if (self.isSearching) 
    { 
     // Ensure the correct height of the original tableview while displaying the searchresults-tableview 
     // only this will make sure, the height of the UITableViewIndex is set correctly ... 
     [UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^(){ 
      CGRect rect = self.tableView.frame; 
      rect.size.height += [self.tableView convertRect:[[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil].size.height; 
      self.tableView.frame = rect; 
     }]; 
    } 
} 

Es posible que tenga que modificar esto.

Cuestiones relacionadas