65 votes

Empêcher un UISearchDisplayController de cacher la barre de navigation

Chaque fois qu'un utilisateur commence à modifier un UISearchDisplayControllers'barre de recherche, la recherche contrôleur devient actif et cache la vue de la barre de navigation tout en présentant la recherche de table. Est-il possible d'empêcher un UISearchDisplayController de cacher la barre de navigation sans réimplanter?

60voto

stigi Points 3189

J'ai juste une mise au point un peu en UISearchDisplayController et a constaté que c'est l'appel d'une méthode privée sur UINavigationController pour masquer la barre de navigation. Ce qui se passe en setActive:animation:. Si vous sous-classe UISearchDisplayController et de remplacer cette méthode avec le code suivant, vous pouvez éviter la navigationBar d'être caché par faire semblant d'être déjà caché.

- (void)setActive:(BOOL)visible animated:(BOOL)animated;
{
    if(self.active == visible) return;
    [self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];
    [super setActive:visible animated:animated];
    [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
    if (visible) {
        [self.searchBar becomeFirstResponder];
    } else {
        [self.searchBar resignFirstResponder];
    }   
}

Laissez-moi savoir si cela fonctionne pour vous. J'espère aussi que ce ne sera pas de pause dans les futures versions iOS... Testé sur 4.0 uniquement.

52voto

Pavel Sharanda Points 444

La solution la plus simple et pas de hacks.

@interface MySearchDisplayController : UISearchDisplayController

@end

@implementation MySearchDisplayController

- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
    [super setActive: visible animated: animated];

    [self.searchContentsController.navigationController setNavigationBarHidden: NO animated: NO];
}

@end

28voto

joerick Points 6215

Les réponses ci-dessus ne fonctionne pas tout à fait bon pour moi. Ma solution est de tromper les UISearchDisplayController en penser il y n'était pas un UINavigationController.

Dans votre vue-contrôleur, ajoutez cette méthode

- (UINavigationController *)navigationController {
    return nil;
}

Cela n'a pas eu de fâcheux effets secondaires pour moi, malgré l'apparente comme une très mauvaise idée... Si vous avez besoin pour obtenir à la manette de navigation, utilisez [super navigationController].

9voto

ah335 Points 105

Essayé ce d'une manière différente, sans sous-classement UISearchDisplayController. Dans votre classe UIViewController où vous définissez le délégué pour UISearchDisplayController, de mettre en œuvre searchDisplayControllerDidBeginSearch: et ajouter l'utilisation

[self.navigationController setNavigationBarHidden:NO animated:YES];

A fait le tour pour moi, l'espoir qui aide.

4voto

jrc Points 1834

J'ai couru dans le présent tout en s'attaquant à un problème un peu différent. Lors de l'utilisation UISearchDisplayController, je veux la barre de recherche pour être dans la barre de navigation (pas de sous).

Il n'est pas difficile de mettre la barre de recherche dans la barre de navigation (voir UISearchBar et UINavigationItem). Cependant, UISearchDisplayController suppose la barre de recherche est toujours en dessous de la barre de navigation (comme expliqué ici) insiste sur le masquage de la barre de navigation lors de la saisie de recherche, de sorte que les choses ont l'air terrible. En outre, UISearchDisplayController teintes de la barre de recherche plus léger que la normale.

J'ai trouvé une solution. L'astuce est de (contre-intuitivement) décrocher UISearchDisplayController de contrôle de toute UISearchBar à tous. Si vous utilisez xibs, cela signifie la suppression de la barre de recherche de l'instance, ou au moins décrocher la prise de courant. Puis de créer votre propre UISearchBar:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UISearchBar *searchBar = [[[UISearchBar alloc] init] autorelease];
    [searchBar sizeToFit]; // standard size
    searchBar.delegate = self;

    // Add search bar to navigation bar
    self.navigationItem.titleView = searchBar;
}

Vous devez activer manuellement la recherche de contrôle de l'affichage lorsque l'utilisateur appuie sur la barre de recherche (en -searchBarShouldBeginEditing:) manuellement et de faire disparaître la barre de recherche lorsque l'utilisateur termine la recherche (en -searchDisplayControllerWillEndSearch:).

#pragma mark <UISearchBarDelegate>

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
    // Manually activate search mode
    // Use animated=NO so we'll be able to immediately un-hide it again
    [self.searchDisplayController setActive:YES animated:NO];

    // Hand over control to UISearchDisplayController during the search
    searchBar.delegate = (id <UISearchBarDelegate>)self.searchDisplayController;

    return YES;
}

#pragma mark <UISearchDisplayDelegate>

- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController
*)controller {
    // Un-hide the navigation bar that UISearchDisplayController hid
    [self.navigationController setNavigationBarHidden:NO animated:NO];
}

- (void) searchDisplayControllerWillEndSearch:(UISearchDisplayController
*)controller {
    UISearchBar *searchBar = (UISearchBar *)self.navigationItem.titleView;

    // Manually resign search mode
    [searchBar resignFirstResponder];

    // Take back control of the search bar
    searchBar.delegate = self;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X