example bar ios objective-c keyboard uisearchbar uisearchcontroller

ios - example - uisearchbardelegate



Al asignar el foco a través de BecomeFirstResponder a UISearchController de UISearchBar, el teclado no aparece (10)

En iOS 10, tuve que ejecutar el código en el método de delegado en el hilo principal. Primero puse el activo en SÍ en viewDidAppear,

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

y luego en el método delegado:

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

He pasado bastante tiempo buscando en línea y hablando con otros desarrolladores sobre este tema sin ningún resultado. El problema exacto se describe en esta publicación SO ( Enfoque en la barra UISearch pero el teclado no aparece ), aunque tiene muchos años.

Recientemente cambié de usar el UISearchDisplayController y UISearchBar en desuso en el IB, y cambié a UISearchController a través del código para iOS8.

Sin embargo, el problema que obtengo es que el enfoque está asignado correctamente (se puede decir porque el botón de cancelación se anima a la derecha de la barra de búsqueda después de que se carga la vista), sin embargo, el teclado no aparece.

Aquí está el código que tengo.

.h

@property (nonatomic, strong) UISearchController *searchController;

.metro

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

Las cosas que he probado hasta ahora.

  • He intentado llamar a BecomeFirstResponder con un retraso de 0,2 segundos, como se sugiere en otra publicación de SO.

  • He establecido un punto de interrupción en viewDidAppear y he verificado que tanto self.searchController como self.searchController.searchBar son objetos válidos, ninguno nulo.

  • He intentado ajustarme a UISearchControllerDelegate y usar el siguiente fragmento de código

aquí:

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

  • He creado una nueva vista desde cero en los guiones gráficos y seguí a esa en lugar de eso, para asegurarme de que no tenía algún remanente antiguo de searchBar en mi vista. Esto no funcionó bien.

  • Solo probé esto en un dispositivo real (iPhone 6), y no es un problema de simulador de no mostrar el teclado.

Me he quedado sin ideas y he visto todas las preguntas y respuestas relacionadas con esta en la web. Nada está funcionando.

Para aclarar de nuevo lo que está pasando, la barra de búsqueda se convierte correctamente en el primer respondedor, el botón de cancelación a la derecha de la misma se anima en la pantalla, lo que prueba esto, pero el teclado no aparece y el cursor no parpadea en la barra de búsqueda.


En iOS 9, he encontrado que es suficiente para retrasar becomeFirstResponder() al siguiente ciclo de ejecución:

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



La solución que funcionará es la siguiente:

1. Anule ViewDidLayoutSubviews en el controlador de vista en el que está mostrando UISearchController

2. Omitir ViewDidLayoutSubviews y, en su interior, hacer que la barra de búsqueda sea el primer respondedor.

Probado en iOS> 9.0

Precaución: coloque una comprobación nula antes de convertirla en el primer respondedor de la siguiente manera

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

Esto se debe a que también se llama a ViewDidLayoutSubviews cuando se presiona el botón de cancelar.

Esto funcionó para mí en Xamarin.


Solución de trabajo 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() } }


Solución de trabajo: -

No use [self.searchController setActive: YES] antes de convertirse en FirstResponder.

- (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]; }); }); }


Su código se ve bien. Lo que estás describiendo no es un comportamiento normal. Lo primero que puede hacer es crear un nuevo proyecto con solo la funcionalidad UISearchController y ver cómo va. Puedes editar tu pregunta con ella para que tengamos una mejor vista.

Aquí hay un buen ejemplo de cómo implementar UISearchController : Sample-UISearchController

Añadiendo:

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

a MasterViewController_TableResults.m dio los resultados esperados y el teclado apareció en el lanzamiento en un iPad y iPhone con iOS 8.3.

Puedes revisar ese proyecto y ver lo que hiciste de manera diferente,

Editar:

Aparentemente, si se [self.searchController setActive:YES] antes de becomeFirstResponder el teclado no se mostrará. Me pregunto si eso es un error o no.


Tenía el mismo problema molesto. Usted pensaría que al establecer SearchController como activo, ambos presentarían el controlador de búsqueda y el teclado. Lamentablemente, solo hace la primera parte.

Mi solución

  • en viewDidAppear activa el controlador de búsqueda:

    override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) resultSearchController.active = true }

  • una vez que está activo, en didPresentSearchController make como primer respondedor

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


Tuve problemas con un UISearchBar que no muestra el teclado cuando hago

[searchBar becomeFirstResponder];

Al buscar en la red, encontré este thread en el sitio web del desarrollador de Apple que me ayudó a descubrir que el teclado no se abrirá si no tiene una ventana clave.

La aplicación en la que trabajo hace algo como esto:

  1. Ventana A (KeyWindow)
  2. hacer algunas cosas
  3. abrir la ventana B (KeyWindow)
  4. hacer algunas cosas
  5. cerrar la ventana B (renunciar a KeyWindow)

Solo tenía que hacer

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

Después de la renuncia de la ventana B y no más problemas con el teclado.


-(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]; }