16

Si usa un UISearchDisplayController con un UITableViewController, cuando el usuario toca la barra de búsqueda, se anima para reemplazar la barra de navegación.¿Cómo puedo usar UISearchDisplayController con UICollectionViewController?

Me gustaría obtener el mismo efecto cuando utilizo un UISearchBar en la parte superior de un UICollectionViewController. ¿Algunas ideas?

+0

¿Has hecho algún progreso con esta pregunta? Estoy tratando de hacer lo mismo ... Todo lo que he hecho hasta ahora es agregar una barra de búsqueda como encabezado de sección, pero en realidad no se procesa bien. – aspyct

+0

No tengo nada :(. –

+0

Cualquiera? Yo podría usar esto también ... parece que la mejor solución en este momento puede ser simplemente subclasificar el UISearchBar/UISearchDisplayController y enseñarles cómo interactuar con el UICollectionView. – Raconteur

Respuesta

2

Tuve que agregar la barra de búsqueda programáticamente como una subvista de UICollectionReusableView, nunca pude hacerlo funcionar a través de IB ya que recibí un prototipo de error al asignar una salida. Agregar la barra de búsqueda en el archivo de implementación funcionó para mí.

Los métodos relevantes son los siguientes.

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:CellIdentifier]; 
    _objectChanges = [NSMutableArray array]; 
    _sectionChanges = [NSMutableArray array]; 
    [self performFetch]; 
    searchBar = [[UISearchBar alloc] 
        initWithFrame:CGRectMake(0.0, 50.0, self.view.bounds.size.width, 
              44.0)]; 
    searchBar.placeholder = @"Search for channels"; 
    searchBar.tintColor = [UIColor blackColor]; 
    searchBar.delegate = self; 
} 


-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 
{ 
    SupplementaryView *header = nil; 

    if ([kind isEqual:UICollectionElementKindSectionHeader]) 
    { 
     header = [self.collectionView dequeueReusableSupplementaryViewOfKind:kind 
                withReuseIdentifier:@"reuseHeader" 
                  forIndexPath:indexPath]; 

     [header addSubview:searchBar]; 

    } 
    return header; 
} 
+0

¿Cuál es su 'Vista Suplementaria'? – AaoIi

1

yo sólo tenían la misma pregunta, y se me ocurrió una solución a medias, pero trabajando que no implica reescribir UISearchDisplayController.

(RESULTADO FINAL: Un UITableView --que respuestas a shouldReloadTableForSearchString-- superpone en la parte superior de la UICollectionView, una vez que haga clic en Buscar se descartó, y tiene sus resultados en la CollectionView leyendo si esto es de interés.)

En el IB creé un UIViewController en el que inserté (vea la captura de pantalla): una vista para propósitos de diseño -> en la que primero solté un UISearchBar y un controlador de pantalla. En la misma vista (uno al lado del otro) dejé caer un UICollectionView con un UICollectionViewCell personalizado. Luego dejé caer un UITableViewProvider (con una UITableCell personalizada, pero eso no es obligatorio, también puedes ignorar el UITabBarItem y el elemento Nav en la captura de pantalla, sin importancia)

Establecí la altura de UITableView en 0 y se conectó todos los puntos de venta y delegados, y el resultado neto es el siguiente, cuando el cursor ingresa a UISearchBox, la superposición UITableView en la parte superior de UICollectionView, a medida que se escribe se llama el archivo shouldReloadTableForSearchString del y los resultados aparecen en tableView; En searchBarSearchButtonClicked simplemente configuro dataSource de UICollectionView y llamo reloadData en su salida, et Voila.

Uno pensaría que Apple debería generar genéticamente el controlador de visualización de búsqueda; tal vez en una versión futura?

(Esto funciona porque esa es la forma se optimiza el controlador UISearchDisplay, IIRC hay realmente una UITableView por la introducción de caracteres apilados uno encima del otro)

(No publicar código porque hay un poco involucrados; PLZ preguntar si todo lo que no es sencillo)

enter image description here

+1

¿Ha implementado esto o solo la teoría?Por favor, elabore sobre la anulación de los métodos de delegado. Gracias. – chandu

0

Aquí sólo un código sWIFT - trabajó para mí!

func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { 

    let headerView = self.mainPictureCollectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "headerView", forIndexPath: indexPath) 

    headerView.addSubview(searchBar) 
    return headerView 
} 
Cuestiones relacionadas