Display UISearchController la barra di ricerca a livello di programmazione

Nota 1: Questa domanda riguarda l’aggiunta di un UISearchController barra di ricerca al di fuori della tabella di visualizzare gli aggiornamenti – NON come la tabella di visualizzazione dell’intestazione.

Nota 2: Alcuni tentativi ed errori mi hanno portato ad una soluzione. Si prega di vedere il mio risposta di seguito.

Sono nuovo di sviluppo iOS e sto lottando per lavorare con il UISearchController classe. Ho un view controller, e a mio modo di vedere controller di vista, ho intenzione di avere una barra di ricerca al di sopra di una vista tabella. Vorrei la barra di ricerca per essere collegato a un UISearchController. Dal interface builder non viene fornito con un UISearchController, sto aggiungendo il controller a livello di programmazione. Dopo un’istanza di un UISearchController, ho cercato di aggiungere la ricerca di controller di ricerca di bar a mio parere a livello di programmazione, ma non hanno avuto successo. Ho provato impostando la barra di ricerca del telaio e le dà un layout automatico vincoli, ma né l’approccio ha funzionato per me (cioè quando ho eseguito l’applicazione, non viene visualizzato nulla). Ecco l’ultimo codice che ho provato:

    let searchController = UISearchController(searchResultsController: nil)

    //Set the search bar's frame
    searchController.searchBar.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 50)

    //Constraint to pin the search bar to the top of the view
    let topConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
    searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)

    self.view.addSubview(searchController.searchBar)

    self.view.addConstraint(topConstraint)

Qualsiasi aiuto sarebbe molto apprezzato! Grazie!

EDIT: Usando solo uno dei due l’impostazione della barra di ricerca di frame o dando layout automatico vincoli (rispetto a una combinazione di entrambi, come ho inizialmente provato) sembra funzionare in un primo momento, ma dopo aver selezionato la barra di ricerca si hanno problemi come sottolineato da Dwight. Ho lasciato il codice per questi casi, nel caso in cui è utile confronto a quello che hai attualmente, ma per una soluzione di lavoro di vedere la mia risposta qui sotto.

Utilizzando layout automatico vincoli:

    let searchController = UISearchController(searchResultsController: nil)

    let topConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: (statusBarHeight + navigationBarHeight!))
    let leftConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: 0)
    let rightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 0)
    let heightConstraint = NSLayoutConstraint(item: searchController.searchBar, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 44)
    searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)

    searchController.searchBar.addConstraint(heightConstraint)

    self.view.addSubview(searchController.searchBar)

    self.view.addConstraints([topConstraint, leftConstraint, rightConstraint])

Ho impostato il topConstraint costante l’altezza della barra di stato, più l’altezza della barra di navigazione, come la mia view controller è integrato in un controller di navigazione.

Regolazione del telaio:

    let searchController = UISearchController(searchResultsController: nil)

    searchController.searchBar.frame = CGRect(x: 0, y: (statusBarHeight + navigationBarHeight!), width: self.view.frame.size.width, height: 44)

    self.view.addSubview(searchController.searchBar)
  • provare questo link1, link2 può essere aiutare
  • grazie per il link! Il primo sembra fare proprio quello che voglio con un po ‘ di più interface builder coinvolgimento, così ho un’occhiata più da vicino. I secondo gli usi UISearchDisplayController, che, credo, è deprecato come di iOS 8.
  • Ho incontrato lo stesso problema come voi, però sto avendo problemi, dopo che l’utente tocca la barra di ricerca. Con il telaio opzione, la barra di ricerca scivola fuori dalla vista e tableview è dimostrato, ma non è posizionato correttamente. Con i vincoli di opzione, l’applicazione si blocca con un “La gerarchia della vista non è preparato per il vincolo:” errore una volta sfruttato. Avete incontrato questi problemi?
  • grazie per questo. Si sono di destra né di soluzione modifica 1 opere. Ho confermato gli stessi problemi che hai avuto. Vedere modifica 2! Che sembra funzionare bene per me. Fatemi sapere se questo funziona per voi!
  • wow, grazie mille per la risposta, ho pensato che questo potrebbe essere una causa persa. Edit 2 funziona brillantemente, bel lavoro! Un dolore solo per ottenere la funzionalità di UISearchDisplayController con UISearchController! Si dovrebbe sicuramente post edit 2 come una risposta a questa domanda per aiutare gli altri. Grazie ancora!
  • Nessun problema, sono contento che ha funzionato per voi!

InformationsquelleAutor kcstricks | 2015-07-08



2 Replies
  1. 15

    Dopo alcuni tentativi ed errori, ho il seguente soluzione:

    1. Aprire Principale.storyboard e aggiungere al vostro controller di visualizzazione di una UIView con altezza 44 (altezza predefinita di un UISearchBar) e una UITableView. Impostare il layout automatico vincoli in modo che la UIView è appuntato per i due lati e la parte superiore del layout di guida (utilizzando la parte superiore del layout di guida assicura che questo sarà il lavoro che la tua view controller è integrato in un controller di navigazione) e la tabella di vista è bloccata, ai due lati, il fondo layout di guida, e la sua cima inchiodato al fondo della UIView.
    2. Collegare il UIView e UITableView come IBOutlets nel ViewController.swift. Nel mio progetto, ho chiamato il loro topView e tableView.
    3. Dichiarare una ricerca di controller in alto ViewController.swift: var searchController: UISearchController!
    4. Poi, nel viewDidLoad(), è necessario:

      //Initialize and set up the search controller
      self.searchController = UISearchController(searchResultsController: nil)
      self.searchController.searchResultsUpdater = self
      self.searchController.dimsBackgroundDuringPresentation = false //Optional
      self.searchController.searchBar.delegate = self
      
      //Add the search bar as a subview of the UIView you added above the table view
      self.topView.addSubview(self.searchController.searchBar)
      //Call sizeToFit() on the search bar so it fits nicely in the UIView
      self.searchController.searchBar.sizeToFit()
      //For some reason, the search bar will extend outside the view to the left after calling sizeToFit. This next line corrects this.
      self.searchController.searchBar.frame.size.width = self.view.frame.size.width

    Questo dovrebbe essere! Naturalmente, è necessario per rendere il vostro controller di visualizzazione di un UITableViewDatasource, UITableViewDelegate, UISearchBarDelegate, UISearchControllerDelegate, e UISearchResultsUpdating e prendersi cura di tutto il necessario delegato di metodi, ma per quanto riguarda la barra di ricerca va, questo ha funzionato per me. Si prega di commento, se avete problemi.

    • “// Per qualche motivo, la barra di ricerca si estenderà al di fuori della vista a sinistra”. Infatti, nel viewDidLoad() i fotogrammi di un punto di vista non ancora calcolato giusto, anche se la tua barra di ricerca ottiene un frame sbagliato che è il modo più grande di quanto dovrebbe essere. se volete fare le cose correttamente, fare il sizeToFit() nella viewDidAppear o dopo la vostra vista finito l’interfaccia grafica di tutto.
    • grazie per l’input. Ho un rapido follow-up domanda per voi: se questo è il caso, e il telaio della vista non è ancora stato calcolato correttamente quando l’ho chiamata sizeToFit(), quindi non si sa perché ha funzionato per impostare il campo larghezza e la larghezza della vista sul seguente riga di codice? Se la vista da un telaio ancora non calcolato correttamente, a questo punto, non dovrebbe di cui sopra non funziona?
    • Purtroppo non riesce a trovare qualcosa di molto dettagliate su sizeToFit(), ma come è scritto:- >”Ridimensiona e sposta il ricevitore di visualizzare in modo che appena racchiude la sua secondarie.” Che significa probabilmente che un forte telaio calcolo avviene come nel caso di “layoutIfNeeded()”, così dopo si chiama “sizeToFit()” si ottiene vista per cui il telaio è stato calcolato prima che sarebbe successo in genere dopo il “viewDidLayoutSubviews” o “viewDidAppear”.
    • grazie per il testa a testa. Questo sarà bene tenere a mente la prossima volta sono io a fare confusione con i fotogrammi durante la fase di caricamento di vista 🙂
    • Non credo che questo funziona se si sta tentando di aggiungere la barra di ricerca in una vista che non è l’intera larghezza del view controller. Mi sembra che la barra di ricerca sarà una larghezza inferiore a quella del view controller.
    • Quando faccio questo e mi tocca sulla barra di ricerca, la barra di ricerca salta giù come 80 punti. Quando ho annulla ricerca va di nuovo a dove era. Qualcuno sa come risolvere questo problema?
    • Ehi @coolcool1994! Non ho guardato a questo codice in anni, non sono più di lavoro sulla app. Qualcosa che sicuramente avrebbe cambiato tra oggi e allora. Fatto a capirlo?

  2. -1

    provare questo:

            let searchController = UISearchController(searchResultsController: nil).searchBar
    
            //Set the search bar's frame
            searchController.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 50)
    
            //Constraint to pin the search bar to the top of the view
            let topConstraint = NSLayoutConstraint(item: searchController, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
    //       searchController.setTranslatesAutoresizingMaskIntoConstraints(false)
    
            self.view.addSubview(searchController)
    //       self.presentViewController(searchController, animated: true, completion: nil)
    
            self.view.addConstraint(topConstraint)

    o si può solo fare questo:

        searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)   
    ->  searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(true)
    • Grazie per il vostro aiuto! Io sono un po ‘ confuso dal tuo primo suggerimento, perché questo sembra solo aggiungere una barra di ricerca, piuttosto che una barra di ricerca che è associato con la ricerca di controller. Per favore mi corregga se ho sbagliato. Per il tuo secondo suggerimento, impostazione setTranslatesAutoResizingMaskIntoconstraints a vere e proprie opere per visualizzare la barra di ricerca, a condizione di aver specificato la sua cornice. Tuttavia, credo che questo flag è impostato su true per impostazione predefinita, quindi penso che si può specificare un telaio e lasciare questa linea come ho fatto a MODIFICARE 1 del mio post.

Lascia un commento