Pregunta

Estoy intentando configurar un controlador de pantalla de búsqueda para manejar asíncrono produce a partir de un servicio web. Tengo los bits básicos en su lugar, pero se han encontrado con un problema muy extraño que no puedo entender.

Parece que aparejar el controlador de pantalla de búsqueda de asincrónico que realmente sólo tiene que hacer dos cosas:

  1. no retorno para searchDisplayController: shouldReloadTableForSearchString, y
  2. mango searchBarSearchButtonClicked y el fuego de la mesa de recarga yo mismo.

Me estoy haciendo ambas cosas, pero lo que estoy viendo es que el controlador de pantalla de búsqueda está recargando la mesa en el primer carácter escrito en la barra de búsqueda a pesar de que estoy volviendo NO de acuerdo con # 1. Que no vuelve a cargar sobre los caracteres posteriores introducidos.

Por lo tanto, mi pregunta es: ¿Cómo puedo mantener el controlador de pantalla de búsqueda de intentar recargar la mesa mientras el usuario está escribiendo? (Específicamente en ese primer carácter introducido)

he visto este problema mencionado como parte de un par de otras preguntas, pero no he visto una respuesta directa al problema. Me gustaría entender lo que está pasando o lo que estoy haciendo mal antes de recurrir a un montón de interfaz de usuario mangling a trabajar alrededor de ella.

Aquí está una destilación rápida de mi código para mostrar el tema. Cuando ejecuto esto y escribo "abcde" en la barra de búsqueda, después de tipo "A" los resultados se muestran como "un # 0", "un # 2", etc. que no se actualizan de nuevo hasta que me golpeó el botón de búsqueda luego ves "abcde # 0", "abcde # 1", etc. resultado deseado es, por supuesto, no pasa nada hasta que golpeé el botón de búsqueda.

#pragma mark -
#pragma mark UISearchDisplayController Delegate Methods

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    return NO;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
    return NO;
}


#pragma mark -
#pragma mark UISearchBarDelegate Methods

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    [self.searchDisplayController.searchResultsTableView reloadData];

}


#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    cell.textLabel.text = [self.searchDisplayController.searchBar.text stringByAppendingFormat:@" #%d", indexPath.row]; 
    return cell;
}

Gracias! (Por cierto, esta es mi primera pregunta aquí, por favor, hágamelo saber si me olvido de cualquiera de los puntos de la etiqueta:)

¿Fue útil?

Solución

Esto es sólo la forma en UISearchDisplayController (SDC) obras. Cuando el usuario entra en el primer carácter en la barra de búsqueda la searchTable se carga y se visualiza por primera vez haciendo que se cargue. Los métodos "... shouldReloadTableForSearchString" y "... shouldReloadTableForSearchScope" le permiten controlar si las recargas searchTable automáticamente en caracteres posteriores o un cambio de alcance.

He hecho ambos de los siguientes para proporcionar una buena experiencia de usuario en el primer carácter. descargo de responsabilidad ligera: Tengo implementaciones de ambos que el trabajo, pero esto no es más que un marco para la aplicación de mi memoria. Que puede haber perdido un detalle pero esto debería conseguir que bastante cerca.

Opción 1:. Presente una célula "carga" en el searchTable cuando se escribe el primer carácter

Esta opción permite que el SDC para mostrar la searchResultsTableView cuando el usuario escribe el primer carácter, estado de visualización en cuanto a la actual operación de búsqueda / filtro

  1. en la definición de clase de delegado SDC

      
        
    • añadir el BOOL isLoading Ivar
    •   
    • añadir el UITableView *searchTableView Ivar
    •   
  2. en searchDisplayController:didLoadSearchResultsTableView

      
        
    • conjunto searchTableView = tableView
    •   
  3. en shouldReloadTableForSearchString/Scope

      
        
    • conjunto isLoading = YES
    •   
    • llamar a su método para cargar datos en segundo plano
    •   
    • volver NO
    •   
  4. cuando el filtro de fondo es completa:

      
        
    • conjunto isLoading = NO
    •   
    • [searchTableView reloadData]
    •   
  5. en los diferentes métodos de delegado tableView responden cómo le gusta mostrar el estado de si hay resultados o resultados de búsqueda actuales son de carga en el fondo. Lo que hice es:

      
        
    • si hay resultados de búsqueda actual, los resultados muestran (incluso si la carga / filtrando en el fondo)
    •   
    • Si no hay resultados de búsqueda y isLoading == NO de retorno 1 fila y Show '' No hay coincidencias en una celda
    •   
    • Si no hay resultados de búsqueda y isLoading == YES retorno fila 1 y la actividad de búsqueda y espectáculo en una celda (que suelen utilizar UIActivityIndicatorView)
    •   

Opción 2: Ocultar la searchTableView y mostrar una vista superpuesta en su lugar hasta que los resultados de búsqueda se cargan

Esta opción oculta el searchTableView cuando se carga por primera vez, y sólo vuelve a mostrar que si cuando la búsqueda / filtro es completa. He definido esto como un complemento a la opción 1, ya que se pueden hacer en conjunto, aunque para optimizar las cosas es posible que no se preocupan por que muestra la actividad de búsqueda en el searchResultsTableView si usted está ocultando la mesa y que muestra la superposición.

  1. en la definición de clase de delegado SDC

      
        
    • misma que la opción 1
    •   
    • añadir el UIView *searchTableOverlayView Ivar
    •   
  2. en searchDisplayController:didLoadSearchResultsTableView

      
        
    • misma que la opción 1
    •   
    • crear un UIView para uso como una superposición en lugar de searchTableView que contiene todo lo interfaz de usuario es apropiado para su aplicación y la puso a searchTableOverlayView
    •   
  3. en searchDisplayController:didUnloadSearchResultsTableView

      
        
    • liberación searchTableOverlayView
    •   
  4. en 'searchDisplayController: didShowSearchResultsTableView(may be able to do this insearchDisplayController: willShowSearchResultsTableView`

      
        
    • si hay resultados para mostrar o buscar isLoading == NO   
          
      • seachTableOverlayView.hidden == YES
      •   
    •   
    • else (si isLoading == YES)   
          
      • searchTableOverlayView.frame == searchResultsTableView.frame
      •   
      • añadir seachTableOverlayView como subvista de searchTableVIew.superview
      •   
      • searchTableView.hidden = YES
      •   
    •   
  5. cuando el filtro de fondo es completa

      
        
    • sAME como opción 1
    •   
    • si hay searchResults a la pantalla   
          
      • searchTableCoverView.hidden = YES
      •   
      • searchResultsTableView.hidden = NO
      •   
    •   
    • else   
          
      • searchResultsTableView.hidden = YES
      •   
      • searchTableCoverView.hidden = NO
      •   
    •   
  6. en los diferentes métodos de delegado tableView responden cómo le gusta mostrar el estado de si hay resultados o resultados de búsqueda actuales son de carga en el fondo. Lo que hice es:

      
        
    • misma que la opción 1
    •   

Otros consejos

Por desgracia creo que esto es sólo cómo funciona el UISearchDisplayController. Debe presentar un informe de error a Apple si desea solicitar diferentes opciones para la funcionalidad.

La alternativa sería escribir su propio UISearchBar y UITableView combinación similar a cómo funciona la UISearchDisplayController, entonces obtendrá un mejor control.

Espero que esto ayude!

Cuando se enfrentó al mismo problema que trató de poner una vista superposición en vista de resultados de búsqueda. Eso no me ayuda. Parece que Apple cambian el comportamiento y vi separadores celulares brillaba a través de mi vista. Finalmente se me ocurrió con un enfoque bien.

Al principio mi clase de búsqueda asíncrono tenía su propia superposición, el progreso y otros puntos de vista. UISearchDisplayController se utiliza sólo para el arranque, los métodos de delegado extremo llamadas y ajustarse al flujo de búsqueda predeterminado. Para mostrar la vista He utilizado cualquier subvista puedo poner unos puntos de vista de búsqueda en (como una llamada init):

newView.frame = frame;
[view addSubview:newView];

y luego utilizar la subvista al cambiar mis puntos de vista del progreso de búsqueda:

if (view == currentView)
    return;

view.frame = currentView.frame;
view.alpha = [self getAlphaValueForView:view];

UIView * superView = [currentView superview];
[currentView removeFromSuperview];

currentView = view;
[superView addSubview:currentView];

El problema con el resultado de la búsqueda vacía vista de tabla de parpadear cuando comienzo a utilizar mi controlador de contenido de búsqueda en la rutina de navegación por defecto (controlador de navegación).

Así que para resolver el problema de que comience a usar para la navegación no es un controlador de contenido (en este caso el valor por defecto pantalla de búsqueda controlador de activación), pero un controlador de vacío. Y solía controladores de vacío como una subvista para las vistas de búsqueda.

Así que en total: NO utilice el contenido del controlador de vista UISearchDisplayController en la navegación. Uso stub controlador de vista. Y luego usarlo de fin de poner sus puntos de vista como subvistas.

funcionó muy bien para mí.

Ocultar self.searchDisplayController.searchResultsTableView hasta que el botón de búsqueda de usuario presse

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView;
{
    tableView.hidden = YES;
}

Después de usuario pulse la tecla de búsqueda, y el resultado de la búsqueda se preparan, hacer la tabla de resultados de búsqueda visible

self.searchDisplayController.searchResultsTableView.hidden = NO;
[self.searchDisplayController reloadData]

Esta solución funciona para mí.

Tal vez usted necesita para poner en práctica UISearchDisplayController y luego esta función:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top