web-dev-qa-db-fra.com

Masquer le bouton d'annulation de l'UisearchBar

J'ai un UisearchDisplayController et Uiseearch Barre accrochés à ma vue de vue via des points de vente de mon NIB.

Je voudrais masquer le bouton Annuler afin que l'utilisateur ne le voit jamais. Le problème est que le code suivant masque le bouton, mais seulement après l'avoir afficé à l'utilisateur pour un milliseconde (par exemple, il clignote sur le simulateur et le périphérique, puis disparaît hors de vue).

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller 
{
    controller.searchBar.showsCancelButton = NO;
}

Y a-t-il un meilleur moyen de le cacher?

28
ArtSabintsev

J'ai réussi à masquer le bouton "Annuler" par sous-classement UISearchBar et remplacer cette méthode:

-(void)layoutSubviews{
    [super layoutSubviews];
    [self setShowsCancelButton:NO animated:NO];
}
37
Nim Gat

J'ai eu le même problème, mais j'ai réparé une manière différente.

Pour ceux qui ne peuvent ou ne veulent pas sous-classes UISearchDisplayController, j'ai corrigé le problème en ajoutant un auditeur sur UIKeyboardWillShowNotification et définir [self setShowsCancelButton:NO animated:NO] là.

Dans viewWillAppear::

// Add keyboard observer:
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillAppear:)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

Ensuite, vous créez:

- (void)keyboardWillAppear:(NSNotification *)notification
{
    [YOUR-SEARCHBAR-HERE setShowsCancelButton:NO animated:NO];
}

N'oubliez pas d'ajouter,

[[NSNotificationCenter defaultCenter] removeObserver:self];

dans viewWillDisappear:!

J'espère que cela t'aides!

15
BFeher

Cela semble être un bogue dans Xcode. J'ai soumis cette erreur au site de reporting de bogues d'Apple, et ils ont suivi en demandant plus de code d'échantillon et d'utiliser des cas.

Merci à tous pour votre tentative de résoudre ce problème.

6
ArtSabintsev
class CustomSearchBar: UISearchBar {

    override func setShowsCancelButton(showsCancelButton: Bool, animated: Bool) {
        super.setShowsCancelButton(false, animated: false)
    }

}

class CustomSearchController: UISearchController, UISearchBarDelegate {

    lazy var _searchBar: CustomSearchBar = {
        [unowned self] in
        let customSearchBar = CustomSearchBar(frame: CGRectZero)
        customSearchBar.delegate = self
        return customSearchBar
    }()

    override var searchBar: UISearchBar {
        get {
            return _searchBar
        }
    }

}
3
Harris

Eu ce problème lors de l'utilisation du UISearchBar avec UISearchController. J'utilise mon propre bouton d'annulation, comme le bouton Annuler n'était pas affiché sur iPad avec showsCancelButton = YES, maintenant il ne se cachera pas sur iPhone avec showsCancelButton = NO!

Ce qui suit a fonctionné pour moi.

Définissez le délégué et la valeur initiale:

- (void)viewDidLoad
{
    // ... 
    self.searchController.searchBar.showsCancelButton = NO;
    self.searchController.searchBar.delegate = self;
}

Réinitialiser showsCancelButton à NO 0.1S après le début de la barre de texte.

#pragma mark - UISearchBarDelegate
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        self.searchController.searchBar.showsCancelButton = NO;
    });
}
3
William Denniss

Si vous voulez éviter le sous-classement, implémentez

searchController.searchBar.showsCancelButton = false;

Dans ces deux méthodes de délégués (n'oubliez pas d'attribuer des délégués) :

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController

- (void)didPresentSearchController:(UISearchController *)searchController

Le premier est appelé chaque fois que vous mettez à jour la barre de recherche (Bouton Annuler est visible par défaut) et le second est pour la première activation de la barre de recherche.

2
Jakub Truhlář

Après UisearchDisplayController obsolète dans iOS8, Apple Donner la recherche de la poignée présentation à UisearchControllerdelegate.

vous pouvez donc remplacer la barre de recherche pour masquer le bouton Annuler, comme ci-dessous:

- (void)didPresentSearchController:(UISearchController *)searchController {
    [searchController.searchBar setShowsCancelButton:NO];
}

si vous avez besoin de bouton d'annulation caché à partir d'Inactive State, vous devez définir la barre de recherche sur Init:

search = [[UISearchController alloc] initWithSearchResultsController:nil];
[search.searchBar setShowsCancelButton:NO];
0
ihsan_husnul

Juste basé sur des problèmes que j'ai eu avant d'avoir essayé de la définir dans:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller

Je ne sais pas comment poser cette question dans votre question désolé si cela est hors de propos.

0
jamesC

Si le bouton Annuler apparaît lors de la modification du champ de recherche de la barre de recherche, vous pouvez effectuer ce qui suit. Sous-classe la barre de recherche et dispose-t-il de mettre en œuvre le UITextFieldDelegateprotocol:

@interface CustomAlignedSearchBar : UISearchBar<UITextFieldDelegate>

Puis implémentez textFieldDidBeginEditing: et faire quelque chose comme:

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    [self setShowsCancelButton:self.cancelButtonShown animated:NO];
}

Cela garantira que le bouton Annuler ne s'affichera pas.

0
Don Miguel