2015-06-28 18 views
7

Ho creato un UISearchController in un controller di visualizzazione tabella. Accedo a questo controller di visualizzazione tabella utilizzando una sequenza di passaggi da un altro controller di visualizzazione. Voglio che la tastiera si mostri con il cursore nella barra di ricerca non appena viene premuto il controller della vista tabella.Mostra tastiera automaticamente quando viene caricato UISearchController

ho fatto controllore ricerca attiva nel metodo viewDidLoad utilizzando

self.mySearchController.active = true 

Si fa il controllore ricerca attiva ma ciò non porta la tastiera né il cursore posizionato nella barra di ricerca. Ho anche provato

self.mySearchController.searchBar.becomeFirstResponder() 

Questa linea non sembra avere alcun effetto.

Come si attiva la tastiera automaticamente/a livello di programmazione? Qui di seguito è una versione più dettagliata del mio codice

class PickAddressViewController: UITableViewController, UISearchResultsUpdating { 

var searchText = "" 

var mySearchController = UISearchController() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.mySearchController = ({ 
     let controller = UISearchController(searchResultsController: nil) 
     controller.searchResultsUpdater = self 
     controller.dimsBackgroundDuringPresentation = false 
     controller.searchBar.sizeToFit() 
     controller.searchBar.text = self.searchText 

     self.tableView.tableHeaderView = controller.searchBar 

     return controller 
    })() 

    self.mySearchController.active = true 
    self.mySearchController.searchBar.becomeFirstResponder() 
} 

risposta

3

becomeFirstResponder è la strada da percorrere, ma si dovrebbe farlo non in viewDidLoad. Guarda la seguente discussione per i dettagli - Cannot set searchBar as firstResponder

+4

Grande! Ho provato la soluzione in quel collegamento e funziona! Per qualsiasi neofita come me, oltre al codice che ho scritto nella mia domanda sopra, devi fare quanto segue: Rendi il controller di visualizzazione un UISearchControllerDelegate. Durante la definizione del controller di ricerca, scrivi una riga che dice controller.delegate = self. Inserisci la riga becomeFirstResponder nella funzione delegato denominata "didPresentSearchController" – RookiePro

2

Ho anche provato i suggerimenti elencati nel link citato da Nikita Leonov. Dovevo aggiungere rendere la classe un UISearchControllerDelegate & UISearchBarDelegate e poi ha funzionato. Io non lo faccio u

class PickAddressViewController: UITableViewController, UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.mySearchController = ({ 
      controller.searchBar.delegate = self 
     })() 

     self.mySearchController.active = true 
     self.mySearchController.delegate = self 
    } 

    func didPresentSearchController(searchController: UISearchController) { 
     self.mySearchController.searchBar.becomeFirstResponder() 
    } 
    … 
} 
0

Oltre a fare ciò che gli altri utenti hanno suggerito, ho anche fatto la seguente, e ha funzionato:

searchController.definesPresentationContext = true

2
override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(true) 
    self.navigationItem.titleView = searchController!.searchBar 
    dispatch_async(dispatch_get_main_queue(), { 
     self.searchController?.active = true 
     self.searchController!.searchBar.becomeFirstResponder() 
    }) 
} 

e questo codice

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

assicurati di dare searchController?.delegate = self in viewDidLoad(). Testato su iOS 9. * dispositivo

0

Swift 3 soluzione nel mio caso:

override func viewDidLoad() { 
    super.viewDidLoad() 
    navigationItem.titleView = mySearchController.searchBar 
    mySearchController.searchResultsUpdater = self 
    mySearchController.delegate = self 

} 

override func viewDidAppear(_ animated: Bool) { 
    DispatchQueue.main.async { 
     self.mySearchController.isActive = true 
    } 
} 

func presentSearchController(_ searchController: UISearchController) { 
    mySearchController.searchBar.becomeFirstResponder() 
} 
Problemi correlati