bar iphone uitableview interface uisearchbar
Descargar el archivo fuente (Enlace ACTUALIZADO! (04.01.2016))

iphone - bar - uisearchcontroller swift 4



Agregar UISearchBar mediante programaciĆ³n a UITableView (4)

Estoy intentando agregar un UISearchBar (con su lógica de búsqueda correspondiente) pero hay un problema: estoy utilizando el UITableViewController generado automáticamente de la UITableView lugar de un archivo nib separado y manipulando todo programáticamente en términos de la vista de tabla.

En Interface Builder, hay una opción para agregar una barra de búsqueda y un controlador de pantalla de búsqueda a un nib . ¿Hay alguna manera de llevar a cabo esta misma tarea programáticamente o es a mi favor abandonar el UITableView predeterminado y transferirlo a un archivo de punta UITableView personalizado para que pueda agregar fácilmente UISearchbar ?

Además, he intentado probar solo agregar una barra de búsqueda a mi encabezado UITableView (que es donde quiero que vaya) mediante el siguiente código en mi implementación de viewDidLoad , pero aparece detrás del encabezado de la sección de la tabla y por lo tanto es invisible a menos que la tabla se desplaza hacia abajo para mostrar lo que de otra manera sería un espacio en blanco. ¿Alguna idea de qué pasa con esto?

UISearchBar *testbar = [[UISearchBar alloc] init]; [[self tableView] setTableHeaderView:testbar];


Establezca el marco para UISearchBar:

// Change the position according to your requirements self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 70, 320, 44)];

Si su vista es una subclase de UITableViewController , cámbiela a UIViewController .

  • En su archivo de punta, cree una vista y arrastre su vista de tabla bajo esa vista y cambie la clase de referencia para esa vista a su UIViewController .

  • Cree un IBOutlet de UITableView * myTableView y conéctelo a su archivo de punta. solo necesita cambiar en su archivo VC por ejemplo self a [self.myTableView reloadData];

Ahora puede ajustar tableView y la barra de búsqueda en el plumín mismo.

UISearchDisplay controlador UISearchDisplay tiene su propia UITableView que muestra los resultados de una búsqueda de datos administrados por otro controlador de vista. Aquí, el controlador de visualización de búsqueda combina la barra de búsqueda y la vista de tabla para mostrar los datos de resultados en la vista de tabla, por lo que no requerirá una vista de tabla separada.


Implementar - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section . Esto resolverá el problema de la sección Etiqueta que cubre el encabezadoView


Para agregar un UISearchBar a una UITableView hay cosas que hacer:

  • Declarar e inicializar UISearchBar
  • Declarar e inicializar el UISearchDisplayController
  • Agregue la barra de búsqueda a la tabla
  • Implementar el delegado UISearchDisplayController
  • En el archivo de encabezado declaro mi searchBar, searchDisplayController y las matrices que contienen los datos para mostrar.

ViewController.h:

#import @interface ViewController : UITableViewController { NSArray *originalData; NSMutableArray *searchData; UISearchBar *searchBar; UISearchDisplayController *searchDisplayController; } @end

También agregué 2 delegados a la clase: UISearchBarDelegate y UISearchDisplayDelegate, sin, searchBar simplemente no funciona.

Inicializar datos:

//ViewController.m - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { NSArray *group1 = [[NSArray alloc] initWithObjects:@"Napoli", @"Juventus", @"Inter", @"Milan", @"Lazio", nil]; NSArray *group2 = [[NSArray alloc] initWithObjects:@"Real Madrid", @"Barcelona", @"Villareal", @"Valencia", @"Deportivo", nil]; NSArray *group3 = [[NSArray alloc] initWithObjects:@"Manchester City", @"Manchester United", @"Chelsea", @"Arsenal", @"Liverpool", nil]; originalData = [[NSArray alloc] initWithObjects:group1, group2, group3, nil]; searchData = [[NSMutableArray alloc] init]; } return self; }

Ahora necesitamos inicializar nuestros dos objetos, comenté el código para explicar lo que hago:

//ViewController.m - (void)viewDidLoad { [super viewDidLoad]; searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; /*the search bar widht must be > 1, the height must be at least 44 (the real size of the search bar)*/ searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self]; /*contents controller is the UITableViewController, this let you to reuse the same TableViewController Delegate method used for the main table.*/ searchDisplayController.delegate = self; searchDisplayController.searchResultsDataSource = self; //set the delegate = self. Previously declared in ViewController.h self.tableView.tableHeaderView = searchBar; //this line add the searchBar //on the top of tableView. }

Decidí omitir la parte sobre la inicialización de la celda tableView, puede encontrarla en el código fuente descargable. :)

¡Cuando TableView esté listo, es hora de implementar UISearchDisplayControllerDelegate!

El delegado tiene muchos métodos para controlar cada aspecto de la búsqueda, pero el más importante es

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString

Este método se invoca cada vez que inserta un nuevo carácter en la barra de búsqueda, toma la cadena de búsqueda, realiza la búsqueda a través de los elementos de la tabla y devuelve SÍ.

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { [searchData removeAllObjects]; /*before starting the search is necessary to remove all elements from the array that will contain found items */ NSArray *group; /* in this loop I search through every element (group) (see the code on top) in the "originalData" array, if the string match, the element will be added in a new array called newGroup. Then, if newGroup has 1 or more elements, it will be added in the "searchData" array. shortly, I recreated the structure of the original array "originalData". */ for(group in originalData) //take the n group (eg. group1, group2, group3) //in the original data { NSMutableArray *newGroup = [[NSMutableArray alloc] init]; NSString *element; for(element in group) //take the n element in the group { //(eg. @"Napoli, @"Milan" etc.) NSRange range = [element rangeOfString:searchString options:NSCaseInsensitiveSearch]; if (range.length > 0) { //if the substring match [newGroup addObject:element]; //add the element to group } } if ([newGroup count] > 0) { [searchData addObject:newGroup]; } [newGroup release]; } return YES; }

¡Eso es todo! Este método realizará una búsqueda de texto completo en todos los elementos. Cuando la búsqueda finaliza, tableView se recarga solo. Vea el código fuente para ver otros detalles.

Descargar el archivo fuente (Enlace ACTUALIZADO! (04.01.2016))


en rápido:

let searchController = UISearchController(searchResultsController: nil) let topConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 40) let leftConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: 0) let rightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 0) let heightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 44) searchController.searchBar.translatesAutoresizingMaskIntoConstraints = false searchController.searchBar.addConstraint(heightConstraint) searchController.searchBar.placeholder = "Search Here" searchController.searchResultsUpdater = self searchController.searchBar.delegate = self self.view.addSubview(searchController.searchBar) self.view.addConstraints([topConstraint, leftConstraint, rightConstraint])

agregar delegado:

class ViewController: UIViewController, UISearchBarDelegate

ahora agregue el método de delegado para volver a cargar la vista de tabla:

func searchBarTextDidBeginEditing(searchBar: UISearchBar) { //add your custome code here after search a string tableView.reloadData() } func searchBarTextDidEndEditing(searchBar: UISearchBar) { //add your custome code here after finishing search tableView.reloadData() }