Клавиатура появляется и сразу исчезает, когда вызывается UISearchBar.becomeFirstResponder () - PullRequest
0 голосов
/ 13 октября 2018

У меня UISearchController в navigationItem.searchController, и я хочу, чтобы он фокусировался, когда пользователь выбирает «Поиск» из меню.Вскоре, когда пользователь нажимает на опцию «Поиск» в меню (UITableViewCell), он получает контроллер представления с searchController и вызывает:

guard let navigationVC = presentingViewController as? UINavigationController else { return }
guard let documentsVC = navigationVC.topViewController as? DocumentsViewController else { return }
documentsVC.searchController.searchBar.becomeFirstResponder()

Затем,UISearchBar получает фокус, клавиатура появляется, а затем немедленно исчезает, и у меня нет кода, который мог бы заставить его исчезнуть (например, view.endEditing()).

1GIF стоит более 1000 слов: Keyboard is appearing and immediately disappearing when UISearchBar.becomeFirstResponder() is getting called

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Итак, после многих попыток у меня был какой-то способ заставить его работать, но я уверен, что есть гораздо более элегантные способы сделать это, поэтому если кто-то думает, что у него есть лучший способ, пожалуйста, опубликуйте его здесь и я могу использовать его и пометить ваш ответ как правильный.

Создать функцию focusOnSearchBar() в YourViewController:

func focusOnSearchBar() {
  let searchBar = searchController.searchBar
  if searchBar.canBecomeFirstResponder {
    DispatchQueue.main.async {
      searchBar.becomeFirstResponder()
    }
  } else {
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
      self.focusOnSearchBar()
    }
  }
}

Что он на самом деле делает, так это сам используетрекурсивно и проверять (каждые 0,1 сек), если searchBar.canBecomeFirstResponder. Это проблематичная / не элегантная вещь.

Затем добавьте это к viewDidAppear():

if focusOnSearch {
  searchController.isActive = true
}

Не забудьте добавить расширение в свой ViewController дляUISearchControllerDelegate (и, конечно, установите searchController.delegate = self) и внедрите didPresentSearchController (который будет вызван установкой searchController.isActive = true):

extension YourViewController: UISearchControllerDelegate {
  func didPresentSearchController(_ searchController: UISearchController) {
    if focusOnSearch {
      focusOnSearchBar()
    }
  }
}

Теперь все, что вам нужно сделать, это установить focusOnSearch = true в prepare(for segue:sender:).

* Примечание: , если вы хотите focusOnSearchBar , когда вы находитесь в том же viewController из searchBar, просто установите:

 focusOnSearch = true
 searchController.isActive = true

И это будет работать само собой.

0 голосов
/ 13 октября 2018

Сделайте вашу панель поиска первым респондентом в методе viewDidLoad.Это позволит убедиться, что все готово, прежде чем фокусировать панель поиска.

...