it-swarm.com.de

Wenn Sie der UISearchController-UISearchBar den Fokus über becomeFirstResponder zuweisen, wird die Tastatur nicht angezeigt

Ich habe ziemlich viel Zeit damit verbracht, online zu suchen und erfolglos mit anderen Entwicklern über dieses Problem zu sprechen. Das genaue Problem wird in diesem SO -Post beschrieben ( Fokus auf der UISearchBar, aber die Tastatur erscheint nicht ), obwohl sie viele Jahre alt ist.

Ich habe kürzlich von der Verwendung des veralteten UISearchDisplayController und der UISearchBar in IB gewechselt und bin über den Code für iOS8 auf UISearchController umgestiegen.

Das Problem, das ich bekomme, ist jedoch, dass der Fokus richtig zugewiesen ist (Sie können feststellen, dass sich die Schaltfläche zum Abbrechen rechts neben der Suchleiste bewegt, nachdem die Ansicht geladen wurde), die Tastatur wird jedoch nicht angezeigt.

Hier ist der Code, den ich habe.

.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;
}

Die Dinge, die ich bisher ausprobiert habe.

  • Ich habe den Aufruf von becomeFirstResponder mit einer Verzögerung von 0,2 Sekunden versucht, wie in einem anderen SO -Posten vorgeschlagen.

  • Ich habe einen Haltepunkt in viewDidAppear festgelegt und überprüft, dass sowohl self.searchController als auch self.searchController.searchBar gültige Objekte sind.

  • Ich habe versucht, mich an UISearchControllerDelegate anzupassen und den folgenden Codeausschnitt zu verwenden

hier:

- (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.
}
  • Ich habe in Storyboards eine neue Ansicht von Grund auf erstellt und stattdessen zu dieser Ansicht übergegangen, um sicherzustellen, dass ich keine alten searchBar-Überbleibsel in meiner Ansicht habe. Das hat auch nicht funktioniert.

  • Ich habe dies nur auf einem echten Gerät (iPhone 6) getestet, und es ist kein Simulatorproblem, wenn die Tastatur nicht angezeigt wird.

Ich habe keine Ideen, und ich habe jede Frage und Antwort im Web gesehen. Nichts funktioniert.

Um noch einmal zu klären, was los ist, wird die searchBar korrekt zum ersten Responder. Die Schaltfläche "Cancel" rechts davon animiert dies auf dem Bildschirm. Die Tastatur wird jedoch nicht angezeigt, und der Cursor blinkt nicht in der SearchBar. 

28
chris P

Ihr Code sieht in Ordnung aus. Was Sie beschreiben, ist kein normales Verhalten. Als Erstes können Sie ein neues Projekt nur mit der UISearchController-Funktionalität erstellen und sehen, wie es läuft. Sie können Ihre Frage damit bearbeiten, damit wir eine bessere Sicht haben.

Es gibt ein gutes Beispiel für die Implementierung von UISearchController hier: Sample-UISearchController

Hinzufügen:

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

MasterViewController_TableResults.m gab die erwarteten Ergebnisse an und die Tastatur wurde beim Start auf einem iPad & iPhone mit iOS 8.3 angezeigt. 

Sie können dieses Projekt durchgehen und sehen, was Sie anders gemacht haben.

Bearbeiten:

Wenn [self.searchController setActive:YES] vor becomeFirstResponder aufgerufen wird, wird die Tastatur anscheinend nicht angezeigt. Ich frage mich, ob das ein Fehler ist oder nicht.

19
Segev

Hatte das gleiche ärgerliche Problem ... Sie würden denken, dass, wenn Sie den SearchController als aktiv setzen, sowohl der Suchcontroller als auch die Tastatur angezeigt werden. Leider macht es nur den ersten Teil.

Meine Lösung

  • in viewDidAppear aktivieren Sie den Search Controller:

    override func viewDidAppear(animated: Bool) {
      super.viewDidAppear(animated)
      resultSearchController.active = true 
    }
    
  • sobald es aktiv ist, machen Sie in didPresentSearchController den ersten Responder

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

Swift 3.0 (iOS 10) Arbeitslösung:

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

Unter iOS 9 habe ich festgestellt, dass es ausreicht, becomeFirstResponder() auf die nächste Laufschleife zu verschieben:

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

Arbeitslösung: -

Verwenden Sie [self.searchController setActive: YES] nicht vor becomeFirstResponder.

- (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

In iOS 10 musste ich den Code in der Delegat-Methode auf dem Haupt-Thread ausführen. Zuerst habe ich den aktiven Wert in viewDidAppear auf YES gesetzt,

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

und dann in der Delegat-Methode:

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

Die Lösung, die funktionieren wird, ist wie folgt:

1. Überschreiben Sie ViewDidLayoutSubviews im View-Controller, in dem Sie UISearchController anzeigen.

2.Override ViewDidLayoutSubviews und in ihm wird die Suchleiste zum ersten Responder.

Getestet auf iOS> 9.0

Achtung: Setzen Sie vor dem Erstantworten einen Null-Check wie folgt ein

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

Dies liegt daran, dass ViewDidLayoutSubviews auch aufgerufen wird, wenn die Cancel-Taste gedrückt wird.

Das hat für mich in Xamarin funktioniert.

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

Ich hatte Probleme mit einer UISearchBar, bei der die Tastatur nicht angezeigt wurde

[searchBar becomeFirstResponder];

Bei der Suche im Internet habe ich dieses thread auf der Apple-Entwicklerwebsite gefunden. Dies half mir zu entdecken, dass sich die Tastatur nicht öffnet, wenn Sie kein keyWindow haben.

Die Anwendung, an der ich arbeite, macht so etwas:

  1. Fenster A (KeyWindow)
  2. mach ein paar Dinge
  3. offenes Fenster B (KeyWindow)
  4. mach ein paar Dinge
  5. fenster B schließen (KeyWindow zurücktreten)

Ich musste nur tun

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

nach dem resigning von fenster B und keine probleme mehr mit der tastatur.

0
Sociopathe

Dies kann auch mit den Simulatoreinstellungen zusammenhängen. Deaktivieren Sie einfach Hardware -> Tastatur -> "Hardware-Tastatur anschließen".

Für weitere Details: UISearchBar zeigt beim Berühren keine Tastatur an

0
Özgür