Tengo un tableview para mostrar una lista de dispositivos en mi aplicación. Cuando viewWillAppear se llama, puedo añadir el self.searchDisplayController.searchBar as a subview to a headerView. Yo, a continuación, asignar self.tableView.tableHeaderView = headerView. Se parece a esto:
Barra de búsquedas desaparece de headerview en iOS 7

Me desplazar el formato tableview hacia abajo de modo que headerview va fuera de la vista y, a continuación, vaya a otro controlador de vista tocando en una celda. Cuando vuelvo a este formato tableview, desplácese hasta el headerView, la barra de búsquedas se vuelve invisible, sin embargo en tocar lo invisible área de la searchDisplayController se activa y el botón cancelar no funciona. Esto sucede para iOS 7 solo. ¿Por qué está sucediendo esto?
Barra de búsquedas desaparece de headerview en iOS 7


Nota: sólo se produce si el headerView está fuera de la vista cuando vuelvo a la tableViewController.

  • Añadir un punto de interrupción en algún lugar y ver si el headerView todavía existe.
  • headerView existe, como el botón que he añadido a la izquierda de la barra de búsquedas es Visible y funcionando.
  • De MODO que el botón con dos flechas y líneas de muestra, pero no la búsqueda textfield?
  • sí… ambos se agregan como una subvista a un UIView, que se añade a headerView. Botón aparece pero no la barra de búsquedas.
  • A continuación, compruebe si la barra de búsquedas de vista existe.
  • Sí existe. A continuación están las subvistas a tableHeaderView <__NSArrayM 0xc428690>( <UIButton: 0xc428b00; frame = (0 0; 44 44); opacos = NO; capa = <CALayer: 0xc428ad0>>, <UISearchBar: 0xd15f850; frame = (48 0; 272 44); texto = «; la opacidad = NO; autoresize = W; gestureRecognizers = <NSArray: 0xd15f2e0>; capa = <CALayer: 0xd15f700>> )

InformationsquelleAutor tech savvy | 2013-09-27

9 Comentarios

  1. 18

    He tenido el mismo problema. Cuando voy a depurar en el método delegado de UISearchDisplayController al final estado de la búsqueda, la barra de búsquedas se convierte en una subvista de una UIView, no la UITableView. Por favor vea a continuación el código:

    - (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
    {
        //My Solution: remove the searchBar away from current super view,
        //then add it as subview again to the tableView
        UISearchBar *searchBar = controller.searchBar;
        UIView *superView = searchBar.superview;
        if (![superView isKindOfClass:[UITableView class]]) {
            NSLog(@"Error here");
            [searchBar removeFromSuperview];
            [self.tableView addSubview:searchBar];
        }
        NSLog(@"%@", NSStringFromClass([superView class]));
    }

    Mi solución es quitar la barra de búsquedas, lejos de la actual super vista, a continuación, añadir subvista de nuevo al formato tableview. He probado ya con éxito.
    Espero que ayude!

    Que respecta a

    • Esto es bueno, solucionado el problema! Pero también hay una advertencia acerca de la solución: cuando la eliminación de la barra de búsquedas de superview y su adición al formato tableview, el foco de entrada se pierde!
    • De niza.El trabajo para mí.
  2. 5

    Tengo el mismo problema. la barra de búsqueda está allí y puede recibir eventos de toque. sin embargo, no está representado. Creo que el problema está en UISearchDisplaycontroller, ya que representa muy bien si yo no uso UISearchDisplayController. Terminé de escribir una costumbre SearchDisplaycontroller para reemplazarlo. es muy básico y sólo hace lo que necesito.

    uso es de la misma manera como lo haría el normal UISearchDisplayController pero el auto.searchDisplayController no va a devolver nada. usted tendrá que utilizar otro puntero para referirse a la costumbre de la búsqueda de controlador de pantalla.

    se ve como un gran feo evitar, pero el único que trabajó para mí. dispuestos a escuchar de alternativas.

    @protocol SearchDisplayDelegate;
    
    @interface SearchDisplayController : NSObject<UISearchBarDelegate>
    
    - (id)initWithSearchBar:(UISearchBar *)searchBar contentsController:(UIViewController *)viewController;
    
    @property(nonatomic,assign)                           id<SearchDisplayDelegate> delegate;
    
    @property(nonatomic,getter=isActive)  BOOL            active;  //configure the view controller for searching. default is NO. animated is NO
    - (void)setActive:(BOOL)visible animated:(BOOL)animated;       //animate the view controller for searching
    
    @property(nonatomic,readonly)                         UISearchBar                *searchBar;
    @property(nonatomic,readonly)                         UIViewController           *searchContentsController; //the view we are searching (often a UITableViewController)
    @property(nonatomic,readonly)                         UITableView                *searchResultsTableView;   //will return non-nil. create if requested
    @property(nonatomic,assign)                           id<UITableViewDataSource>   searchResultsDataSource;  //default is nil. delegate can provide
    @property(nonatomic,assign)                           id<UITableViewDelegate>     searchResultsDelegate;
    
    @end
    
    
    @protocol SearchDisplayDelegate <NSObject>
    //implement the protocols you need
    @optional
    @end

    la aplicación

    @implementation SearchDisplayController {
    UISearchBar *_searchBar;
    UIViewController *_viewController;
    UITableView *_searchResultsTableView;
    UIView *_overLay;
    }
    - (void)dealloc {
    [_searchBar release];
    [_searchResultsTableView release];
    [_overLay release];
    [super dealloc];
    }
    - (UIViewController *)searchContentsController {
    return _viewController;
    }
    - (UITableView *)searchResultsTableView {
    return _searchResultsTableView;
    }
    - (id)initWithSearchBar:(UISearchBar *)searchBar contentsController:(UIViewController *)viewController {
    self = [super init];
    if (self) {
    _searchBar = [searchBar retain];
    _searchBar.delegate = self;
    _viewController = viewController;
    _searchResultsTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(_searchBar.frame), _viewController.view.frame.size.width, _viewController.view.frame.size.height - CGRectGetMaxY(_searchBar.frame))];
    _overLay = [[UIView alloc]initWithFrame:_searchResultsTableView.frame];
    _overLay.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5];
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(overLayTapped)];
    [_overLay addGestureRecognizer:tap];
    [tap release];
    }
    return self;
    }
    - (void)setSearchResultsDataSource:(id<UITableViewDataSource>)searchResultsDataSource {
    _searchResultsTableView.dataSource = searchResultsDataSource;
    }
    - (void)setSearchResultsDelegate:(id<UITableViewDelegate>)searchResultsDelegate {
    _searchResultsTableView.delegate = searchResultsDelegate;
    }
    - (void)overLayTapped {
    [self setActive:NO animated:YES];
    [_searchBar resignFirstResponder];
    _searchBar.text = nil;
    _searchBar.showsCancelButton = NO;
    }
    - (void)setActive:(BOOL)visible animated:(BOOL)animated {
    UIView *viewToAdd = nil;
    if (!_searchBar.text.length) {
    viewToAdd = _overLay;
    } else {
    viewToAdd = _searchResultsTableView;
    }
    float a = 0;
    if (visible) {
    [_viewController.view addSubview:viewToAdd];
    a = 1.0;
    }
    if ([_viewController.view respondsToSelector:@selectore(scrollEnabled)]) {
    ((UIScrollView *)_viewController.view).scrollEnabled = !visible;
    }
    if (animated) {
    [UIView animateWithDuration:0.2 animations:^{
    _overLay.alpha = a;
    _searchResultsTableView.alpha = a;
    }];
    } else {
    _overLay.alpha = a;
    _searchResultsTableView.alpha = a;
    }
    }
    - (void)setActive:(BOOL)active {
    [self setActive:active animated:YES];
    }
    #pragma mark - UISearchBar delegate protocols
    - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
    [self setActive:YES animated:YES];
    searchBar.showsCancelButton = YES;
    [_searchResultsTableView reloadData];
    }
    - (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
    }
    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    [_searchResultsTableView reloadData];
    }
    - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    [self overLayTapped];
    }
    - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    if (searchText.length) {
    [_overLay removeFromSuperview];
    [_viewController.view addSubview:_searchResultsTableView];
    } else {
    [_searchResultsTableView removeFromSuperview];
    [_viewController.view addSubview:_overLay];
    }
    [_searchResultsTableView reloadData];
    }
    @end

    Actualización: sobre cómo utilizar este progammatically

    declarar una ivar

    SearchDisplayController *mySearchDisplayController;

    inicializar mediante programación

    mySearchDisplayController = [[SearchDisplayController alloc]initWithSearchBar:mySearchBar contentsController:self];

    la adición de la barra de búsquedas para su formato tableview

    self.tableView.headerView = mySearchBar;

    uso mySearchDisplayController como referencia para la custon clase de lugar en auto.searchDisplayController.

    • En realidad, yo también estoy usando una clase personalizada para la barra de búsquedas y searchDisplaycontroller delegar funciones. Puedo asignar searchDisplayController a esta clase en xib de la anterior controlador de vista.
    • así que mi solución no funciona para usted?
    • Nope…. no funciona para mí.
    • lo siento, me perdí la parte donde dice usted que el uso xib. Yo uso esta programación. una clase personalizada para la barra de búsquedas debe estar bien como siempre como una subclase de UISearchbar
    • He creado una clase personalizada que es hijo de la clase de searchDisplayController gusta lo que ha hecho anteriormente. Puedo asignar ESTA clase para searchDisplayController en el archivo xib. Cómo asignar programtically?
    • si puedo crear una barra de búsquedas a través de programación y añadir funciona bien. Sin embargo, si uso UISearchBar *barra de búsquedas = auto.searchDisplayController.barra de búsquedas; y poner esto en headerView el problema viene.
    • auto.searchDisplayController es una propiedad readonly. Si no inicializada mediante programación o a través de xib, apunta a nil. inicializar un ivar de la costumbre de searchdisplaycontroller y utilizarlo como referencia en el código. ignorar auto.searchDisplayController. consulte actualizar el post. han actualizado la búsqueda de visualización de la aplicación también.

  3. 2

    En mi caso, la tabla de la vista que se celebró la búsqueda de controlador de pantalla de la barra de búsqueda en la cabecera de la vista se vuelve a cargar casi tan pronto como el punto de vista apareció. Fue en este punto que la barra de búsqueda dejaría de prestar. Cuando me desplaza la mesa, iba a aparecer. También vale la pena mencionar que mi tabla contiene una UIRefreshControl y fue no un UITableViewController subclase.

    Mi solución implica la configuración de la búsqueda de controlador de pantalla activo inactivo muy rápidamente justo antes de después de la carga de la tabla (y acabar con el control de la actualización refrescante):

    [self.tableView reloadData];    
    [self.refreshControl endRefreshing];
    [self.searchDisplayController setActive:YES animated:NO];
    [self.searchDisplayController setActive:NO];


    Un poco de un hack pero a mí me funciona.

  4. 2

    Estoy de acuerdo Phien Tranvía respuesta. Por favor upvote. No tengo suficientes puntos de mí mismo.

    He tenido un problema similar, donde una barra de búsqueda cargado de storyboard desaparecería cuando he aprovechado de ti, invocar y descartar de búsqueda. Su solución repara el problema.

    No parece ser un error por el que repite la invocación y el despido de la búsqueda de controlador de pantalla no siempre da la barra de búsqueda de nuevo a la vista de tabla.

    Voy a decir que me siento incómodo con la solución de la dependencia en la vista de jerarquía. Apple parece reorganización con cada lanzamiento importante. Este código puede romper con iOS 8.

    Creo que una solución permanente requerirá de una revisión por parte de Apple.

    • El botón cancelar no funciona parece que han corregido como de 7.1 beta 2, pero todavía tengo un problema similar con la barra de búsqueda de desaparecer.
  5. 1

    Utilizando el depurador, he encontrado que la UISearchBar es inicialmente un niño de la tableHeaderView – pero cuando desaparece, se ha convertido en un hijo de el formato tableview sí mismo. Este ha sido, probablemente hecho por UISearchDisplayController de alguna manera… Así que hice lo siguiente hack simplemente devolver el UISearchBar a la cabecera de la vista:

    - (void)viewWillAppear:(BOOL)animated
    {
    [super viewWillAppear:animated];
    if(!self.searchDisplayController.isActive && self.searchBar.superview != self.tableView.tableHeaderView) {
    [self.tableView.tableHeaderView addSubview:self.searchBar];
    }
    }

    Parece funcionar bien en iOS 7, así como la 6 🙂

    (la comprobación de que el searchDisplayController no está activo es necesario, de lo contrario el sarch desaparece la barra de búsqueda)

  6. 1

    Yo tenía el mismo problema y lo pude solucionarlo llamando a la línea siguiente después de la creación de la UISearchDisplayController

    [self performSelector:@selector(setSearchDisplayController:) withObject:displayController];

    Mi viewDidLoad función de este aspecto:

    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 44)];
    searchBar.placeholder = NSLocalizedString(@"Search", @"Search");
    UISearchDisplayController *displayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    displayController.delegate = self;
    displayController.searchResultsDataSource = self;
    displayController.searchResultsDelegate = self;
    [self performSelector:@selector(setSearchDisplayController:) withObject:displayController];
    self.tableView.contentOffset = CGPointMake(0, 44);
    self.tableView.tableHeaderView = searchBar;

    Gracias a esta respuesta: https://stackoverflow.com/a/17324921/1070393

  7. 1

    Uso UISearchBar por encima de UITableView,a Continuación, hacer IBOutlet y conectarlos con el propietario del archivo a UISearchbar

    Ejemplo- .h archivo

    #import <UIKit/UIKit.h>
    @interface LocationViewController : UIViewController<UISearchBarDelegate>
    {
    BOOL IsSearchOn;
    }
    @property (strong, nonatomic) IBOutlet UISearchBar *searchBar;
    @property (strong, nonatomic) IBOutlet UITableView *TBVLocation;

    .m archivo

    #pragma mark -
    #pragma mark UISearchBar Delegate Methods
    -(void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
    {
    [self.searchResult removeAllObjects];
    if(searchText.length == 0)
    {
    IsSearchOn=NO;
    //[filteredTableData removeAllObjects];
    [self.searchBar resignFirstResponder];
    //[self .tblView reloadData];
    }
    else
    {
    IsSearchOn=YES;
    if(searchText != nil && ![searchText isEqualToString:@""])
    {
    /*            NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@", searchText];
    self.searchResult = [NSMutableArray arrayWithArray: [searchArray filteredArrayUsingPredicate:resultPredicate]];*/
    for(int i=0;i<[[arrCountryList valueForKey:@"country_name"] count];i++)
    {
    NSRange titleRange =    [[[[arrCountryList valueForKey:@"country_name"] objectAtIndex:i] lowercaseString] rangeOfString:[searchText lowercaseString]];
    if(titleRange.location != NSNotFound)
    [self.searchResult addObject:[arrCountryList objectAtIndex:i]];
    }
    [TBVLocation reloadData];
    }
    }
    }
    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
    {
    [searchBar resignFirstResponder];
    }
    -(void)searchBarCancelButtonClicked:(UISearchBar *) searchBar
    {
    [searchBar resignFirstResponder];
    IsSearchOn=NO;
    searchBar.text = nil;
    [TBVLocation reloadData];
    }
    - (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
    {
    [searchBar resignFirstResponder];
    return YES;
    }
    - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
    {
    searchBar.showsCancelButton = YES;
    searchBar.autocorrectionType = UITextAutocorrectionTypeNo;
    //IsSearchOn=YES;
    }
    - (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
    {
    IsSearchOn=NO;
    searchBar.showsCancelButton = NO;
    [TBVLocation reloadData];
    [searchBar resignFirstResponder];
    }

    Funcionará como el encanto.

  8. 1

    He enfrentado a un problema similar y después de algo de investigación, he encontrado que este es un error en UISearchBar jerarquía. Este hacky solución que funcionó para mí en iOS 7, pero ser conscientes de que esto puede romper en futuras versiones de iOS:

    - (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    UIView *buggyView = [self.searchDisplayController.searchBar.subviews firstObject];
    //buggyView bounds and center are incorrect after returning from controller, so adjust them.
    buggyView.bounds = self.searchDisplayController.searchBar.bounds;
    buggyView.center = CGPointMake(CGRectGetWidth(buggyView.bounds)/2, CGRectGetHeight(buggyView.bounds)/2);
    }
    • Esto funciona! gracias
  9. 0

    Yo tenía el mismo problema y probado algunas de las soluciones que aquí se propone en este hilo, pero no resolver el problema para mí.
    Anteriormente, he agregado y configurado el UISearchBar en el

     - (void)viewDidLoad

    método de mi ViewController en el código.

    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:searchBarView.frame];
    searchBar.delegate = self;
    searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;
    ect...

    Lo resuelto este problema para mí es que he añadido un UISearchbar en el InterfaceBuilder, creó una toma de corriente en mi ViewController y añadió esta UISearchBar a mi UISearchDisplayController.

    self.searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar(<--outlet) contentsController:self];

    espero que esto también podría ayudar a algunas personas

Dejar respuesta

Please enter your comment!
Please enter your name here