2016-01-27 16 views
8

Ich möchte hinzufügen, eine "Filter" oder "Sortieren" -Taste neben der searchBar innerhalb einer UISearchController. Ich habe bereits versucht, die UIButton und die searchbar in eine UIView und setzen Sie diese als meine UITableView tableView.tableHeaderView Dies funktioniert nicht, weil die tableView.tableHeaderView bekommen nur auf die UISearchBar zurückgesetzt wird, wenn Sie den Controller entlassen. Hier ist ein Beispiel, wie ich will, dass es aussieht: enter image description hereHinzufügen Filter Schaltfläche zu UISearchController

+0

gibt es einen bestimmten Grund, warum Sie eine Suche-Controller verwenden? Bist du offen dafür, es nicht zu benutzen und die Tabellenansicht direkt zu filtern? – Wain

+0

Der Grund ist rein optisch. Also würde ich mit allem in Ordnung sein – smnk

+0

Ich sollte genauer sein, haben Sie bereits eine Tabellenansicht, sind Sie glücklich, nur zu filtern oder verwenden Sie eine speziell andere Ansicht, um die Suchergebnisse zu präsentieren/wollen die Search Controller Overlay-Fähigkeit? – Wain

Antwort

0

Ich würde den Suchcontroller verlieren, bietet es keine Features, die Sie wirklich wollen und die zusätzliche Ansicht/VC, die Sie liefern müssen, fügt Komplexität/Code hinzu Vervielfältigung.

Ihre vorhandene Tabellenansicht hat bereits alles, was Sie brauchen, weil es eine Datenquelle hat. Das ist entweder ein Array oder ein FRC. Wenn es sich um ein Array handelt, können Sie den Inhalt des Arrays durch Ihren gefilterten Inhalt ersetzen, und wenn es ein FRC ist, können Sie das Prädikat ändern.

Hinweis: Im Array-Fall haben Sie 2 Array-Referenzen, 1 zeigt auf ein Array, das alle ungefilterten Elemente enthält, und ein anderes, das anfänglich ein Verweis auf das gleiche Array ist. Der zweite Verweis wird zum Auffüllen der Tabellenansicht verwendet. Wenn Sie dann filtern, erstellen Sie ein neues Array mit nur den gefilterten Elementen und verweisen auf die zweite Referenz.

Anstatt die Search-Controller-Delegate-Methode zu implementieren, implementieren Sie die Suchleisten-Delegate-Methoden und verwenden Sie diese, um Filterung und Reset auszulösen.

Jetzt haben Sie den Suchcontroller los, Sie wechseln auch nicht die Tabellenansichten, Sie haben also nur 1 TV- und 1 Header-Ansicht. Jetzt gibt es keinen Grund mehr, die Header-Ansicht zu ändern und alles funktioniert.

+0

Rücktritt Ich verstehe nicht, was Sie suchen. Ich möchte nicht wissen, wie man einen TableView filtert, sondern wie man einen Filter Button direkt neben der Suchleiste (in einem Search Controller im Idealfall) bekommt. – smnk

+1

Deshalb habe ich gefragt, ob ich den Search Controller verlieren könnte. Das Problem, das Sie haben, besteht darin, dass der Such-Controller eine andere Ansicht darstellt, so dass die Kopfzeile anders konfiguriert ist. Sie sollten nur einen anderen Header in der anderen Ansicht einrichten können. Ich finde, dass Suchmaschinen-Controller Komplexität für wenig echten Nutzen hinzufügen. Wenn Sie nur 1 Ansicht haben, haben Sie 1 Kopfzeile, die einfach zu konfigurieren ist und die Fokusverwaltung ist auch einfach. – Wain

3

Ich habe versucht, viele Art und Weise searchbar anzupassen ist, aber nichts hat mir geholfen, endlich einen Weg gefunden Voll zu füllen Ihre Anforderung

let mysearchController = UISearchController(searchResultsController: nil) 
    mysearchController.searchBar.showsCancelButton = true 
    mysearchController.searchBar.barStyle = UIBarStyle.Black 
    for var subView1 in mysearchController.searchBar.subviews{ 
     for var subView2 in subView1.subviews{ 
      if subView2 .isKindOfClass(UIButton){ 
       let customizedCancelButton:UIButton = subView2 as! UIButton 
       customizedCancelButton.enabled = true 
       customizedCancelButton.setTitle("", forState: UIControlState.Normal) 
       let image1 = UIImage(named: "Sort") 
       customizedCancelButton.setBackgroundImage(image1, forState: UIControlState.Normal) 
       customizedCancelButton.addTarget(self, action: "sort", forControlEvents: UIControlEvents.TouchUpInside) 
      } 
     } 
    } 

obigen Code einfach viel zu verstehen.

func sort(){ 
     print("sort button fired!!!") 
    } 

enter image description here

4

Statt die UISearchBar von Customizing und die Dinge zu verkomplizieren, können Sie es einfach halten, indem Sie Ihren eigenen Knopf neben SearchBar hinzufügen.

Stellen Sie die No Shows Abbruchtaste Option für SearchBar mit

self.searchBar.showsCancelButton = true 

ODER

deaktivieren Shows Abbruchtaste Option für SearchBar in der Storyboard-

enter image description here

hinzufügen eigener Knopf b eside SearchBar wie unten gezeigt

enter image description here

und dann entsprechend IBAction auf die Schaltfläche Hinzufügen und Ihre Aktionen in ihm führen.

Auch im Idealfall ist es nicht empfehlenswert, diese Sicht in Header von tableview einzutragen. Es wird besser sein, wenn es über der Tabellenansicht ist, die auch von Apple gefolgt wird.

enter image description here

3

Ich konnte einen Suchfilter mit ein paar Zeilen Code erstellen. Ich hoffe, es hilft.

* Ich wählte die Lesezeichenschaltfläche, um Filtersymbol anzuwenden; weil ich bereits cancel button für benutzerdefinierte aktion verwendet habe.

Zuerst haben Sie delegate searchBar, um Lesezeichen-Schaltfläche Klick Aktion zu behandeln. Dann sollten Sie die Eigenschaften wie folgt festlegen. Wenn Sie eine benutzerdefinierte Position angeben möchten (Standardposition ist die rechte Seite), müssen Sie "Positionseinstellung" festlegen.

searchController.searchBar.delegate = self 
searchController.searchBar.showsBookmarkButton = true 
searchController.searchBar.setImage(UIImage(named: "Sort.png"), for: .bookmark, state: .normal) 
// MARK: You may change position of bookmark button. 
//searchController.searchBar.setPositionAdjustment(UIOffset(horizontal: 0, vertical: 0), for: .bookmark) 

Dann überschreiben searchBarBookmarkButtonClicked-Funktion in Ihrem VC. Sie können das click-Ereignis in dieser Methode behandeln.

func searchBarBookmarkButtonClicked(_ searchBar: UISearchBar) { //showAlert, presentVC or whatever you want here }

Auch wenn Sie Lesezeichen-Taste ausblenden möchten, während Such Controller aktiv ist, müssen Sie die Kontrolle innerhalb updateSearchResults Methode anzuwenden.

if searchController.isActive { 
    searchController.searchBar.showsBookmarkButton = false 
} else { 
    searchController.searchBar.showsBookmarkButton = true 
} 

While searchController is not active

searchController is active

+0

Tolle Lösung! Vielen Dank. – Alessign

Verwandte Themen