37 votes

UISearchBar désactiver la désactivation automatique du bouton d'annulation

J'ai mis en place un UISearchBar dans une vue de table et presque tout fonctionne sauf une petite chose: Quand je tape un texte, puis appuyez sur le bouton de recherche sur le clavier, le clavier disparaît, les résultats de la recherche sont les seuls éléments présentés dans le tableau, le texte reste dans le UISearchBar, mais le bouton annuler a été désactivé.

J'ai essayé d'obtenir ma liste aussi fermer les fonctionnalités de l'Apple app contacts et lorsque vous appuyez sur rechercher dans l'application, il n'a pas de désactiver le bouton annuler.

Quand j'ai regardé dans le UISearchBar fichier d'en-tête, j'ai remarqué un drapeau pour autoDisableCancelButton en vertu de la _searchBarFlags struct mais il est privé.

Il y a une chose qui me manque quand je le programme d'installation de la UISearchBar?

51voto

rplankenhorn Points 932

J'ai trouvé une solution. Vous pouvez l'utiliser pour faire une boucle pour parcourir les sous-vues de la barre de recherche et l'activer lorsque vous appuyez sur le bouton de recherche du clavier.

 for (UIView *possibleButton in searchBar.subviews)
{
    if ([possibleButton isKindOfClass:[UIButton class]])
    {
        UIButton *cancelButton = (UIButton*)possibleButton;
        cancelButton.enabled = YES;
        break;
    }
}
 

15voto

David Douglas Points 1410

J'ai dû peaufiner cela un peu pour que cela fonctionne pour moi dans 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;
            }
        }
    }
}
 

3voto

ArtOfWarfare Points 2345

Voici ma solution, qui fonctionne pour toutes les situations dans toutes les versions d'iOS.

IE, d'autres solutions ne gèrent pas lorsque le clavier est fermé parce que l'utilisateur a fait glisser une vue de défilement.

 - (void)enableCancelButton:(UIView *)view {
    if ([view isKindOfClass:[UIButton class]]) {
        [(UIButton *)view setEnabled:YES];
    } else {
        for (UIView *subview in view.subviews) {
            [self enableCancelButton:subview];
        }
    }
}

// This will handle whenever the text field is resigned non-programatically
// (IE, because it's set to resign when the scroll view is dragged in your storyboard.)
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
    [self performSelector:@selector(enableCancelButton:) withObject:searchBar afterDelay:0.001];
}

// Also follow up every [searchBar resignFirstResponder];
// with [self enableCancelButton:searchBar];
 

3voto

scurioni Points 1160

C'est ce qui m'a permis de travailler sur iOS 6:

 searchBar.showsCancelButton = YES;
searchBar.showsScopeBar = YES;
[searchBar sizeToFit];
[searchBar setShowsCancelButton:YES animated:YES];
 

2voto

Matt Quiros Points 2236

Aucune réponse n'a fonctionné pour moi. Je suis ciblage de l'iOS 7. Mais j'ai trouvé une réponse.

Ce que j'essaie quelque chose comme le Twitter de l'application iOS. Si vous cliquez sur la loupe dans l'onglet Délais, l' UISearchBar s'affiche avec le bouton Annuler activé, le clavier montrant, et les recherches récentes de l'écran. Faites défiler les recherches récentes de l'écran et masque le clavier, mais il maintient le bouton Annuler activé.

C'est mon code qui fonctionne:

UIView *searchBarSubview = self.searchBar.subviews[0];
NSArray *subviewCache = [searchBarSubview valueForKeyPath:@"subviewCache"];
if ([subviewCache[2] respondsToSelector:@selector(setEnabled:)]) {
    [subviewCache[2] setValue:@YES forKeyPath:@"enabled"];
}

Je suis arrivé à cette solution en définissant un point d'arrêt à ma table une vue d' scrollViewWillBeginDragging:. J'ai regardé dans mon UISearchBar et met à nu ses sous-vues. Il a toujours juste l'un, qui est de type UIView (ma variable searchBarSubview).

enter image description here

Alors, qu' UIView détient un NSArray appelés subviewCache et j'ai remarqué que le dernier élément, qui est la troisième, est de type UINavigationButton, pas dans l'API publique. Alors je me suis mis à utiliser de clé-valeur de codage à la place. J'ai vérifié si l' UINavigationButton répond setEnabled:, et heureusement, il n'. J'ai donc mis la propriété d' @YES. S'avère que c' UINavigationButton est le bouton Annuler.

Ceci est lié à la pause si Apple décide de changer la mise en œuvre d'un UISearchBars'entrailles, mais ce que l'enfer. Il fonctionne pour l'instant.

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