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?
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];
}
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!
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.
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
}
}
}
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;
});
}
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.
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];
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.
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 UITextFieldDelegate
protocol:
@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.