51 votes

Comment activer le bouton d'annulation avec UISearchBar?

Dans l'application contacts sur l'iPhone si vous entrez un terme de recherche, puis appuyez sur le bouton "Recherche", le clavier est caché, MAIS le bouton annuler est toujours activé. Dans mon appli sur le bouton annuler a été désactivé lorsque j'appelle resignFirstResponder.

Quelqu'un sait comment faire pour masquer le clavier tout en maintenant le bouton annuler dans un état activé?

J'utilise le code suivant:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [searchBar resignFirstResponder];
}

Le clavier glisse hors de vue, mais le bouton "Annuler" à droite de la zone de texte de recherche est désactivé, de sorte que je ne peux pas annuler la recherche. L'application contacts maintient le bouton annuler dans un état activé.

Je pense que peut-être la seule solution est de plonger dans la barre de recherche objet et l'appel de resignFirstResponder sur le champ de texte, plutôt que la barre de recherche elle-même.

Toute entrée est appréciée.

29voto

David Douglas Points 1410

Cette méthode a fonctionné sous iOS7.

 - (void)enableCancelButton:(UISearchBar *)searchBar
{
    for (UIView *view in searchBar.subviews)
    {
        for (id subview in view.subviews)
        {
            if ( [subview isKindOfClass:[UIButton class]] )
            {
                [subview setEnabled:YES];
                NSLog(@"enableCancelButton");
                return;
            }
        }
    }
}
 

(Assurez-vous également de l'appeler n'importe où après l'utilisation de [_searchBar resignFirstResponder].)

22voto

Malek_Jundi Points 3843

essaye ça

 for(id subview in [yourSearchBar subviews])
{
    if ([subview isKindOfClass:[UIButton class]]) {
        [subview setEnabled:YES];
    }
}
 

10voto

Marián Černý Points 1511

La solution acceptée ne fonctionnera pas lorsque vous commencerez à faire défiler le tableau au lieu d'appuyer sur le bouton "Rechercher". Dans ce cas, le bouton "Annuler" sera désactivé.

C'est ma solution qui réactive le bouton "Annuler" chaque fois qu'il est désactivé à l'aide de KVO.

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

    // Search for Cancel button in searchbar, enable it and add key-value observer.
    for (id subview in [self.searchBar subviews]) {
        if ([subview isKindOfClass:[UIButton class]]) {
            [subview setEnabled:YES];
            [subview addObserver:self forKeyPath:@"enabled" options:NSKeyValueObservingOptionNew context:nil];
        }
    }
}

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

    // Remove observer for the Cancel button in searchBar.
    for (id subview in [self.searchBar subviews]) {
        if ([subview isKindOfClass:[UIButton class]])
            [subview removeObserver:self forKeyPath:@"enabled"];
    }
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    // Re-enable the Cancel button in searchBar.
    if ([object isKindOfClass:[UIButton class]] && [keyPath isEqualToString:@"enabled"]) {
        UIButton *button = object;
        if (!button.enabled)
            button.enabled = YES;
    }
}
 

9voto

Ben L. Points 336

Depuis iOS 6, le bouton semble être un UINavigationButton (classe privée) au lieu d'un UIButton.

J'ai modifié l'exemple ci-dessus pour ressembler à ceci.

 for (UIView *v in searchBar.subviews) {
    if ([v isKindOfClass:[UIControl class]]) {
        ((UIControl *)v).enabled = YES;
    }
}
 

Cependant, ceci est évidemment fragile, puisque nous nous disputons avec les internes. Il peut également activer plus que le bouton, mais cela fonctionne pour moi jusqu'à ce qu'une meilleure solution soit trouvée.

Nous devrions demander à Apple d'exposer cela.

8voto

n8chur Points 91

Cela a semblé fonctionner pour moi (dans viewDidLoad):

 __unused UISearchDisplayController* searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
 

Je réalise que je devrais probablement utiliser UISearchDisplayController correctement, mais cela a été une solution de facilité pour mon implémentation actuelle.

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