He tratado de implementar una barra de búsqueda pero no he tenido la suerte de tratar con este problema. Realmente agradecería cualquier ayuda que puede ser proporcionado. Tengo un gran proyecto en el que tengo una vista de tabla, y quiero implementar una barra de búsqueda sobre él y ver el tiempo real de filtrado. Yo no uso el Storyboard, pero estoy usando XIB. He añadido los siguientes protocolos:

<UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate,UISearchDisplayDelegate>

He declarado el 2 de matrices en @interfaz , el primero para el conjunto de elementos y el segundo para el filtrado queridos:

    NSArray*     OldList;
    NSArray*     filteredList;

Entonces he setted el número de filas y el número de secciones y, a continuación:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    myClassCell *cell = [tableView dequeueReusableCellWithIdentifier:MYCELLCLASS];
    if (cell == nil)
    {
        cell = [myClassCell newFromNib];
    }
    NSMutableDictionary* elem = nil;
    if (tableView == self.searchDisplayController.searchResultsTableView)
    {
        elem = [filteredList objectAtIndex:indexPath.row];
        if ([elem count]+1 > indexPath.row)
            [cell showValues:elem];
        else
            [cell showValues:nil];
    }
    else
    {
        elem = [OldList objectAtIndex:indexPath.row];
        if ([elem count]+1 > indexPath.row) 
            [cell showValues:elem];
        else
            [cell showValues:nil];
    }
    return cell;
}

-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
    filteredist = [OldList filteredArrayUsingPredicate:resultPredicate];
}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
    objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
    return YES;
}

En este punto, no he hecho ningún cambio a la xib, sin vínculos y sin otras materias. Si puedo compilar tengo mi tabla, pero obviamente, si yo trato de buscar algo, no funciona nada. Por otra parte, si yo desplácese hacia abajo hasta el final de la tabla de la aplicación se bloquea. El verdadero problema es que no puedo ver la barra de búsqueda de trabajo. Podría alguien ayudarme por favor?

  • Hay una serie de elementos que faltan a partir de su código. Mi sugerencia es para ejecutar un proyecto de prueba utilizando un Guión gráfico, arrastre un UISearchDisplayController en un UITableView, y observar la automática de conexiones de salida que se hizo con Xcode. Estos incluyen el establecimiento de la correspondiente a los delegados. También tendrás la necesidad de abordar la manera en la tabla de la vista de origen de datos métodos de preparar el searchResultsTableView. Vas a encontrar muchos buenos tutoriales de una búsqueda en Google. Hay muchas preguntas sobre LO que aborden el tema de los presentes. Si usted todavía está atascado después de esto, hágamelo saber y voy a ofrecer más sugerencias.
  • Primero de todo gracias por su respuesta. He buscado una solución en google y he encontrado algo interesante tutiorials, eso es cierto, pero yo no había encontrado una manera de yo a solucionar mi problema (mi mala por cierto). Voy a tratar de ir lo más profundo de mi código y voy a tratar de ejecutar un proyecto de prueba con guión, como te han sugerido
  • He seguido tu sugerencia, pero estoy pegado aquí. Yo creo que el principal problema está relacionado con la conexión desde el código a la xib.
  • Esto podría ayudar a alguien stackoverflow.com/a/39388169/2033377

1 Comentario

  1. 19

    Bien estás en el camino correcto… es hacer exactamente con la conexión de su clase de controlador para el controlador xib.

    Cuando se desea iniciar una Barra de Búsqueda y la Búsqueda de Controlador de Pantalla en un UITableView, que son efectivamente la adición de un segundo la vista de la tabla que, cuando se activa, debe ser administrado por el código en su UITableViewController clase de la misma manera como cualquier UITableView.

    He utilizado estas preguntas/respuestas para comprobar mi propia respuesta – recomiendo que le eches un vistazo:

    He leído el La Documentación De Apple. Te recomiendo que hagas lo mismo para ayudarle a entender esto.

    Primer Paso:

    Deberá establecer la fuente de datos y los métodos de delegado para ambas vistas de tabla cuando se ejecuta el controlador de clase.

    Antes de hacer nada de esto, incluir esta propiedad…

    @property (nonatomic, strong) UISearchDisplayController *searchController;

    El código siguiente se describe cómo activar y configurar las propiedades adecuadas para un UISearchBar y un UISearchDisplayController. Si usted es de crear mediante programación un UITableViewController en el código también será necesario establecer el origen de datos y delegado para ello (no se muestra para mantener el código fácil de leer).

    Aquí tiene dos opciones – que usted elija depende de su código y de lo que deseas lograr – establecer estos en su init/awakeFromNib métodos, o conjunto de estos, en uno de la tabla de la vista controlador (TVC) métodos del ciclo de vida.

    Opción Uno – Init

    (Nota 1: Paul Hegarty extraordinario de iTunesU conferencias me enseñó a init/despierto una clase como la siguiente, de esta manera, usted está cubierto para ambos escenarios – se llama init o puede awakeFromNib.)

    - (void)setup {
        // Provide initialisation code here!!!
        UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
        [searchBar sizeToFit];
        [searchBar setDelegate:self];
    
        [self setSearchController:[[UISearchDisplayController alloc] initWithSearchBar:searchBar
                                                                    contentsController:self]];
        [self.searchController setSearchResultsDataSource:self];
        [self.searchController setSearchResultsDelegate:self];
        [self.searchController setDelegate:self];
    }
    
    - (void)awakeFromNib {
        [self setup];
    }
    
    - (id)initWithStyle:(UITableViewStyle)style {
        self = [super initWithStyle:style];
        if (self) {
            [self setup];
        }
        return self;
    }

    O

    Opción de Dos TVC ciclo de vida de

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
        [searchBar sizeToFit];
        [searchBar setDelegate:self];
    
        [self setSearchController:[[UISearchDisplayController alloc] initWithSearchBar:searchBar
                                                                    contentsController:self]];
        [self.searchController setSearchResultsDataSource:self];
        [self.searchController setSearchResultsDelegate:self];
        [self.searchController setDelegate:self];
    
        [self.tableView setTableHeaderView:self.searchController.searchBar]; //see Note2
    
        ...< other code as required >...
    }

    Note2: Independientemente de cuál de estas opciones que usted elija, usted tendrá que colocar la siguiente línea de código en su viewDidLoad método…

        [self.tableView setTableHeaderView:self.searchController.searchBar]; //(or just searchBar)

    Segundo Paso:

    Notas:

    • La vista de la tabla que representa el conjunto de datos completo (OldList) puede ser llamada utilizando self.tableView (PS convenio es el inicio de cada variable con el menor caso – así que cambie su nombre de la propiedad de OldList a oldList).

    • La vista de la tabla que representa los datos filtrados conjunto (filteredList) puede ser llamada utilizando self.searchController.searchResultsTableView.

    Mientras que usted ha preparado su tableView:cellForRowAtIndexPath: origen de datos método, sospecho que tiene otro origen de datos (y tal vez delegado) los métodos que deben ser informados de que la vista de la tabla es la tabla actual punto de vista, antes de que son capaces de funcionar adecuadamente y proporcionar usted con un completo operativo de búsqueda de la tabla de resultados de la vista y la función de búsqueda.

    Por ejemplo:

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        if (tableView == self.searchController.searchResultsTableView)
            return 1;
        return [[self.oldList sections] count];;
    }

    y:

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        if (tableView == self.searchController.searchResultsTableView)
            return [self.filteredList count];
        return [self.oldList count];
    }

    Tenga en cuenta que puede haber otra fuente de datos (y tal vez delegado) los métodos que deben ser informados de que la vista de la tabla es la tabla actual punto de vista… yo se lo dejo a usted para determinar cuál de estos métodos van a ser modificados, y el correspondiente código necesario para ajustar la vista de tabla.

    Tercer Paso:

    Usted tendrá que registrar una punta y la reutilización de un identificador para su búsqueda los resultados de la vista de tabla.

    Prefiero crear un archivo nib (llamado «TableViewCellSearch.xib») que contiene una vista de tabla de la célula, con la reutilización identificador «SearchCell» y, a continuación, coloque el código de registro de la plumilla y la reutilización de identificador en la siguiente UISearchDisplayController método de delegado.

    Vale la pena señalar que este código es igual de efectivo después de que el bloque de código de los ejemplos anteriores en init/awakeFromNib/viewDidLoad.

    - (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView {
        static NSString *cellIdentifierSearch = @"SearchCell";
        UINib *nib = [UINib nibWithNibName:@"TableViewCellSearch" bundle:nil];
        [self.searchController.searchResultsTableView registerNib:nib forCellReuseIdentifier:cellIdentifierSearch];
    }

    Pruebe estas sugerencias.

    Espero que esto ayude.

    • muchas gracias por tu tiempo y tu ayuda. He encontrado esta respuesta tan útil y completa. Esto sólo para decir que realmente aprecio su trabajo y su tiempo para ayudarme! Gracias!
    • por su ayuda pero tengo un pequeño problema…yo estoy usando tableviewcontroller por la placa de la historia con extracción para actualizar la funcionalidad y también implementar searchview de controlador de pantalla y su trabajo bien, pero quiero que este searchdisplay controlador muestra siempre en la parte superior del formato tableview…he intentado mucho, pero todavía no del éxito….puede usted por favor me ayude, ¿cómo puedo lograr esto??
    • Gracias @BandishDave mientras yo estoy feliz de tratar de ayudar, creo que tu problema es la base para una nueva pregunta. Yo te recomiendo detalle su problema en una nueva pregunta. Si haces eso, hágamelo saber y voy a echar un vistazo.
    • gracias por repetición… aquí está mi pregunta….stackoverflow.com/questions/29821860/……… por favor, hágamelo saber si usted tiene alguna solución …
    • parece SCT siempre una respuesta adecuada a su pregunta, un buen resultado. Déjame saber si te quedas atascado de nuevo.
    • sí tienes razón que la sct le dio una respuesta, pero él sugirió searchview con UIViewController mientras yo quiero en UITableviewController….así que es posible?? y si sí que, ¿cómo?
    • hay maneras y he hecho antes, por la colocación de un UIView en su guión jerarquía en el mismo nivel que el UITableView. Voy a revisar lo que está involucrado y responder a su pregunta.

Dejar respuesta

Please enter your comment!
Please enter your name here