2017-03-21 3 views
0

iOS, SwiftWie verwende ich die Suchleiste, um mehrere Ansichten zu durchsuchen? (IOS Swift)

Was die App jetzt ist:

Die Hauptansicht dieser App enthält Kategorien (in einer Tabellenansicht angeordnet), wenn die Kategorien klicken, bringt die App den Benutzer eine Scroll-Ansicht mit Grundtext und Bildern. Die Hauptansicht enthält auch eine Suchleiste. Der Benutzer kann einen Kategorienamen eingeben und die Ergebnisse filtern.

Was die App tun muss:

ich die Suchleiste verbessern möchten, und gefilterten Ergebnisse. Ich möchte, dass der Benutzer die Möglichkeit hat, Kategorienamen nicht nur durch Eingabe des Namens der Kategorie zu filtern, sondern auch durch Eingabe von Text, der in einer bestimmten Scroll-Ansicht enthalten ist.

Beispiel: Die Kategorienamen sind: "Buchstaben" und "Zahlen". Wenn der Benutzer auf "Briefe" klickt, werden sie in eine Ansicht mit der Bezeichnung "A B C D .. Z" gebracht, wenn "Numbers" angeklickt wird, werden sie zu der Ansicht "1 2 3 4 .. 10" gebracht. Wenn der Benutzer "A B" in die Suchleiste eingibt, wird in der Hauptansicht nur die Kategorie "Briefe" angezeigt. Wenn der Benutzer "3" in die Suchleiste eingibt, wird in der Hauptansicht nur die Kategorie "Zahlen" angezeigt.

Im Fazit:

Ich bin immer noch ziemlich neu in App-Entwicklung, und das hat mich ratlos. Jede Hilfe würde sehr geschätzt werden, ob Code oder eine Referenz.

Vielen Dank.

Tableviewcontroller

Variablen:

@IBOutlet var searchForTool: UISearchBar! 
@IBOutlet var toolTable: UITableView! 

var searchActive : Bool = false 
var filtered : [String] = [] 
var data = [" Make", " Model"] 
var identities = ["A", "B"] 

Search Bar Filter:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 

    filtered = data.filter({ (text: String) -> Bool in 

     return text.range(of: searchText, options: String.CompareOptions.caseInsensitive) != nil 
    }) 

    if(filtered.count == 0){ 
     searchActive = false 
    } else { 
     searchActive = true 
    } 
    self.toolTable.reloadData() 
} 

Angezeigte Zellen:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CustomCell 

    if(searchActive){ 
     cell.toolLabel.text = filtered[indexPath.row] 
    } else { 
     cell.toolLabel.text = data[indexPath.row] 
    } 
    return cell 
} 

Zeigt bei Bedarf mehr Code an.

+0

Code und Screenshots für nicht bereitstellt meine Codestruktur früher –

+0

Ordnung würde helfen Hinzufügen Ich werde einige Codes aus dem Tableviewcontroller –

Antwort

0

Es gibt einige Probleme hier:

  • , wie Ihre Daten strukturiert ist?

als Lösung dieses Problems ich für so etwas gehen würde:

class Item { 
    var name: String! 
    init(name: String) { 
     self.name = name 
    } 
} 

class Category { 
    var items = [Item]() 
    var name: String! 

    init(items: [Item], name: String) { 
     self.items = items 
     self.name = name 
    } 
} 

Sie können es wie folgt verwenden:

let letterItems = [Item(name: "A"), Item(name: "B"), Item(name: "C")] 
let lettersCategory = Category(items: letterItems, name: "Letters") 

let numberItems = [Item(name: "1"), Item(name: "2"), Item(name: "3")] 
let numbersCategory = Category(items: numberItems, name: "Numbers") 

let cat: [Category] = [lettersCategory, numbersCategory] 
  • Wie wird Ihre Suche definiert?

Hier können Sie mehrere Möglichkeiten:

  1. Suchtext gefunden werden muss, wie es in einem der category.name oder item.name geschrieben wird: die „AB“ wird nicht in diesem Fall in einem von item.name gefunden. Wenn die Suche "A" -> "Letters" ist ein Spiel

    let searchItem = "A" 
    
    let result = cat.filter({ $0.name.range(of: searchItem) != nil || $0.items.filter({$0.name.range(of: searchItem) != nil }).count > 0}) 
    
  2. ein "oder" Suche, wie Google tut:

    • erste separate Suchbegriff durch ""
    • nehmen jedes Element und verwendet die gleiche Methode wie oben -
    • abzuflachen Ergebnis
    • hinzufügen zu einem results variable
    • continu e mit dem nächsten Wort
+0

Vielen Dank für die Antwort, und leider hinzufügen (ich habe jetzt). Wie Sie sehen können, unterscheidet sich unsere Struktur. Aber ich werde Ihren Code weiter untersuchen, er könnte mich der Lösung näher bringen. –

+0

Sie müssen Ihre Entitäten verbinden: 'Daten' mit' Identitäten', so dass Sie einen Kaskadierungsfilter erstellen können. –

+0

Wie würde ich das machen? Von den Bits, die ich lese, klingt das ziemlich kompliziert. Mit biquadratischen Filterfunktionen, vDSP API, etc. –

Verwandte Themen