2016-07-20 16 views
0

Ich muss Arrays, die die Werte von searchController auffüllt.Wie können Sie zwei Werte aus einem anderen Array als Ergebnis von searchController laden?

let textLabel = ["Uni", "Uni", "Faber-Castell", "Faber-Castell","Faber-Castell", "Pilot", "Pilot"] 
let detailTextLabel = ["Pen", "Pencil", "Crayon", "Mechanical Pencil", "Contour Pencil", "Eraser", "Sharpener"] 

Diese beiden Arrays Paar, während die Daten von UITableViewController. Wie (Uni, Pen) Nachladen (Uni, Bleistift), (Faber-Castell, Kreide), ...

In Paaren erste ist der Zelltitel, der zweite ist der Untertitel. Ich folgte iOSCreator's tutorial.

Mein Problem ist, wenn ich Text suche es nur Titel Abschnitt aktualisiert, nicht der Untertitel, wie es erwartet wurde.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell 

    // 3 
    if (self.resultSearchController.active) { 
    // it only updates textLabel. But when I add detailTextLabel 
    // subtitles comes wrong because first array contains one element 
    // more than twice. 
     cell.textLabel?.text = filteredTableData[indexPath.row] 

     return cell 
    } else { 
     cell.textLabel?.text = tableData[indexPath.row] 

     return cell 
    } 
    } 

    func updateSearchResultsForSearchController(searchController: UISearchController) { 
    filteredTableData.removeAll(keepCapacity: false) 

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text) 
    let array = (tableData as NSArray).filteredArrayUsingPredicate(searchPredicate) 
    filteredTableData = array as! [String] 

    self.tableView.reloadData() 
    } 
+0

prüfen Apples UISearchController Quellcode. –

Antwort

-1

die einzelnen Array wie folgt verwendet:

let penList = ["Uni:Pen", "Uni:Pencil", "Faber-Castell:Crayon"] 

let result = filteredTableData[indexPath.row] // example: "Uni:Pen" 
let clearResult = String(result.characters.map { $0 == ":" ? " " : $0 }) 
// clearResult like this "Uni Pen" 
cell.textLabel?.text = clearResult 

Sie können auch Daten erhalten getrennt

let result = filteredTableData[indexPath.row] 
let resultArray = result.componentsSeparatedByString(":") 
let firstText = resultArray[0] // title text 
let secondText = resultArray[1] // subtitle text 
+0

Ich denke du hast Untertitel übersprungen. –

+0

Dies ist keine gute Lösung. Sie machen künstlich Strings mit verschiedenen Werten, die Sie später aufteilen müssen (was teuer und kompliziert ist). Verwenden Sie structs/classes/tuples, um stattdessen ein Wertepaar zu speichern. – Moritz

+0

Aber was ist, wenn ich zu viele Werte habe? Ich meine ungefähr tausend Werte, die nicht von Hand eingegeben werden können. @EricD –