Die Suchleiste von UISearchController programmgesteuert anzeigen

Anmerkung 1 Diese Frage bezieht sich auf das Hinzufügen der Suchleiste eines UISearchControllers außerhalb der aktualisierten Tabellenansicht - NICHT als Kopfzeile der Tabellenansicht.

Anmerkung 2 Einige Versuche führten mich zu einer Lösung. Bitte sehen Sie meinAntworte unten.

Ich bin neu in der iOS-Entwicklung und habe Probleme, mit der UISearchController-Klasse zu arbeiten. Ich habe einen Ansichtscontroller und in der Ansicht meines Ansichtscontrollers ist eine Suchleiste über einer Tabellenansicht geplant. Ich möchte, dass die Suchleiste mit einem UISearchController verknüpft ist. Da Interface Builder nicht mit einem UISearchController geliefert wird, füge ich den Controller programmgesteuert hinzu. Nachdem ich einen UISearchController instanziiert habe, habe ich versucht, die Suchleiste des Search Controllers programmgesteuert zu meiner Ansicht hinzuzufügen, war jedoch nicht erfolgreich. Ich habe versucht, den Rahmen der Suchleiste festzulegen und ihm Autolayout-Einschränkungen zu geben, aber bei mir hat keiner der beiden Ansätze funktioniert (d. H., Wenn ich die App ausführe, wird nichts angezeigt). Hier ist der neueste Code, den ich ausprobiert habe:

    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)

Jede Hilfe wäre sehr dankbar! Vielen Dank

BEARBEITEN Wenn Sie entweder nur einen Rahmen für die Suchleiste festlegen oder die Autolayout-Einschränkungen festlegen (im Gegensatz zu einer Kombination aus beiden, wie ich es ursprünglich versucht habe), scheint dies zunächst zu funktionieren. Nach dem Tippen auf die Suchleiste treten jedoch Probleme auf, auf die Sie hingewiesen haben Dwight. Ich habe den Code für diese Fälle für den Fall hinterlassen, dass ein Vergleich mit dem, was Sie derzeit haben, hilfreich ist. Eine funktionierende Lösung finden Sie in meiner Antwort unten.

Mit Autolayout-Einschränkungen:

    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])

Ich habe die topConstraint-Konstante auf die Höhe der Statusleiste plus die Höhe der Navigationsleiste festgelegt, da mein Ansichtscontroller in einen Navigationscontroller eingebettet ist.

Einstellen des Rahmens:

    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)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage