web-dev-qa-db-fra.com

Lors de l'attribution du focus via devenant FirstFreeResponder à UISearchBar de UISearchController, le clavier n'apparaît pas.

J'ai passé pas mal de temps à chercher en ligne et à parler à d'autres développeurs de cette question sans succès. Le problème exact est décrit dans cet article SO ( Concentrez-vous sur la barre UISearchBar mais le clavier n'apparaît pas ), bien qu'il soit vieux de plusieurs années.

J'ai récemment abandonné l'utilisation des logiciels obsolètes UISearchDisplayController et UISearchBar dans IB, puis je suis passé à UISearchController via le code pour iOS8.

Le problème que j’obtiens cependant, c’est que le focus est attribué correctement (vous pouvez le dire, car le bouton Annuler s’anime à droite de la barre de recherche après le chargement de la vue), mais le clavier ne s’affiche pas.

Voici le code que j'ai.

.h

@property (nonatomic, strong) UISearchController *searchController;

.m

- (void)viewDidLoad {
    [super viewDidLoad];
    ...
    [self initializeSearchController];
    ....
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.searchController setActive:YES];
    [self.searchController.searchBar becomeFirstResponder];
}

- (void)initializeSearchController {
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.searchController.searchResultsUpdater = self;
    self.searchController.dimsBackgroundDuringPresentation = NO;
    self.searchController.delegate = self;
    self.searchController.searchBar.delegate = self;
    [self.searchController.searchBar sizeToFit];

    [self.tableView setTableHeaderView:self.searchController.searchBar];
    self.definesPresentationContext = YES;
}

Les choses que j'ai essayées jusqu'à présent.

  • J'ai essayé d'appeler DEVENTRESponder avec un délai de 0,2 seconde, comme suggéré dans un autre message SO.

  • J'ai défini un point d'arrêt dans viewDidAppear et vérifié que self.searchController et self.searchController.searchBar sont des objets valides, ni nil.

  • J'ai essayé de me conformer à UISearchControllerDelegate et d'utiliser l'extrait de code suivant

ici:

- (void)didPresentSearchController:(UISearchController *)searchController {
    //no matter what code I put in here to becomeFirstResponder, it doesn't
    //matter because this is never called, despite setting the     
    //self.searchController.delegate = self AND 
    //self.searchController.searchBar.delegate = self.
}
  • J'ai créé une nouvelle vue à partir de zéro dans les story-boards et je l'ai séparé à la place, afin de m'assurer que je n'ai pas d'ancien vestige de SearchBar dans ma vue. Cela n'a pas fonctionné non plus.

  • Je n'ai testé cela que sur un appareil réel (iPhone 6), et ce n'est pas un problème de simulateur de ne pas afficher le clavier.

Je suis à court d'idées et j'ai vu toutes les questions et réponses liées à celle-ci sur le Web. Rien ne fonctionne.

Pour clarifier ce qui se passe, la barre de recherche devient correctement le premier répondeur, le bouton d'annulation à sa droite s'anime à l'écran, ce qui prouve le contraire. Le clavier n'apparaît pas et le curseur ne clignote pas dans la barre de recherche. 

28
chris P

Votre code a l'air bien. Ce que vous décrivez n'est pas un comportement normal. La première chose à faire est de créer un nouveau projet avec uniquement la fonctionnalité UISearchController et de voir comment il se passe. Vous pouvez modifier votre question avec pour que nous puissions avoir une meilleure vue.

Voici un bon exemple sur la façon de mettre en œuvre UISearchController: Sample-UISearchController

Ajouter:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.searchController.searchBar becomeFirstResponder];
}

à MasterViewController_TableResults.m a donné les résultats escomptés et le clavier est apparu au lancement sur un iPad & iPhone avec iOS 8.3. 

Vous pouvez revoir ce projet et voir ce que vous avez fait différemment,

Modifier:

Apparemment, si [self.searchController setActive:YES] est appelé avant becomeFirstResponder, le clavier ne s'affichera pas. Je me demande si c'est un bug ou pas.

19
Segev

Si vous aviez le même problème ennuyeux… .. Vous pourriez penser qu'en réglant SearchController sur actif, vous présenteriez à la fois le contrôleur de recherche et le clavier. Malheureusement, il ne fait que la première partie.

Ma solution

  • dans viewDidAppear rendre le contrôleur de recherche actif:

    override func viewDidAppear(animated: Bool) {
      super.viewDidAppear(animated)
      resultSearchController.active = true 
    }
    
  • une fois qu'il est actif, dans didPresentSearchController fait en tant que premier répondant

    func didPresentSearchController(searchController: UISearchController) {
      searchController.searchBar.becomeFirstResponder() 
    }
    
18
emn.mun

Solution de travail Swift 3.0 (iOS 10):

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        searchController.isActive = true
        DispatchQueue.main.async { [unowned self] in
            self.searchController.searchBar.becomeFirstResponder()
        }
    }
11
Tendai Moffatt

Sur iOS 9, j'ai trouvé qu'il suffisait de retarder becomeFirstResponder() à la prochaine boucle d'exécution:

func focusSearchField() {
    searchController?.active = true

    // skipping to the next run loop is required, otherwise the keyboard does not appear
    dispatch_async(dispatch_get_main_queue(), { [weak self] in
        self?.searchController?.searchBar.becomeFirstResponder()
    })
}
7
jszumski

Solution de travail: -

N'utilisez pas [self.searchController setActive: YES] avant de devenir FirstFreeResponder.

- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   dispatch_async(dispatch_get_global_queue(0, 0), ^{
    dispatch_async(dispatch_get_main_queue(), ^{
       // [self.searchController setActive:YES];
        [self.searchController.searchBar becomeFirstResponder];
     });
 });
}
3
Jain_Taresh

Dans iOS 10, je devais exécuter le code en méthode déléguée sur le thread principal. D'abord, je règle l'active sur YES dans viewDidAppear,

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
      [self.searchController setActive:YES];
}

puis dans la méthode déléguée:

- (void)didPresentSearchController:(UISearchController *)searchController
{
  dispatch_async(dispatch_get_main_queue(), ^{
  [searchController.searchBar becomeFirstResponder];
  });
}
2
Teja Nandamuri

La solution qui fonctionnera est la suivante:

1.Override ViewDidLayoutSubviews dans le contrôleur de vue dans lequel vous affichez UISearchController

2.Override ViewDidLayoutSubviews et à l'intérieur de celui-ci, premier répondeur dans la barre de recherche.

Testé sur iOS> 9.0

Attention: Mettez un contrôle nul avant de le rendre Premier répondant comme suit

if((searchController != null)&&(searchController.SearchBar != null))
            searchController.SearchBar.BecomeFirstResponder();

En effet, ViewDidLayoutSubviews est également appelé lorsque vous appuyez sur le bouton d'annulation.

Cela a fonctionné pour moi à Xamarin.

2
user3106871
-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.searchController setActive:YES];
}

//and then in the delegate method:

- (void)didPresentSearchController:(UISearchController *)searchController
{
  dispatch_async(dispatch_get_main_queue(), ^{
  [searchController.searchBar becomeFirstResponder];
  });
}

//The above works for me in addition to this I had to add:
-(void)viewWillDisappear:(BOOL)animated {
    [searchController setActive:NO];
}
0
sagaya martin

J'ai eu des problèmes avec un UISearchBar ne pas afficher le clavier lorsque je fais

[searchBar becomeFirstResponder];

En cherchant sur le net, j'ai trouvé ce thread sur le site Web du développeur Apple, qui m'a aidé à découvrir que le clavier ne s'ouvrirait pas si vous n'aviez pas de fenêtre principale.

L'application sur laquelle je travaille fait quelque chose comme ça:

  1. Fenêtre A (KeyWindow)
  2. faire des choses
  3. ouvrir la fenêtre B (KeyWindow)
  4. faire des choses
  5. fermer la fenêtre B (resign KeyWindow)

Je devais juste faire

[[[[UIApplication sharedApplication] windows] firstObject] makeKeyWindow];

après la démission de la fenêtre B et plus aucun problème avec le clavier.

0
Sociopathe

Cela pourrait également être lié aux paramètres du simulateur. Désactivez simplement Matériel -> Clavier -> "Connecter le clavier matériel".

Pour plus de détails: UISearchBar n’affiche pas le clavier lorsque vous appuyez dessus

0
Özgür