2016-05-23 9 views
-2

Hier ist mein Code. Während ich mehrere Tutorials über die Implementierung der Suche in Swift verfolgte, hatte ich kein Glück.Ich bekomme den Fehler "Index 6 über Grenzen [0 .. 5]" "bei der Implementierung der Suche in meiner App

import UIKit 

class DataTableExercisesTableViewController: UITableViewController, UISearchBarDelegate, UISearchResultsUpdating { 

var exercises = ["Abs", "Arms", "Back", "Chest", "Legs", "Shoulders", "Triceps"] 
var searchActive : Bool = false 

@IBOutlet weak var searchBar: UISearchBar! 
var filteredTableData = [String]() 
var resultSearchController = UISearchController() 



override func viewDidLoad() { 
    super.viewDidLoad() 
    self.resultSearchController = ({ 
     let controller = UISearchController(searchResultsController: nil) 
     controller.searchResultsUpdater = self 
     controller.dimsBackgroundDuringPresentation = false 
     controller.searchBar.sizeToFit() 

     self.tableView.tableHeaderView = controller.searchBar 

     return controller 
    })() 

    // Reload the table 
    self.tableView.reloadData() 
} 



// MARK: - Table view data source 



override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return exercises.count; 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell")! as UITableViewCell; 
    if (self.resultSearchController.active) { 
     cell.textLabel?.text = filteredTableData[indexPath.row] 

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

     return cell 
    } 

} 

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

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

    self.tableView.reloadData() 
} 




override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 




    self.tableView.reloadData() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

Ich habe Probleme bei der Implementierung der Suche aus verschiedenen Tutorials und scheint einfach nicht zu gut zu funktionieren. Jede Einsicht wird sehr geschätzt.

Antwort

1

Ihre numberOfRowsInSection gibt immer exercises.count zurück. Aber wenn Sie filtern, verwenden Sie nicht exercises, aber ein kleineres Array, filteredTableData. Genau wie in cellForRowAtIndexPath müssen Sie Ihre Antwort ändern, wenn Sie filtern.

+0

Also muss ich ‚filteredTableData‘ ändern meine Übungen Zeichenfolge zu akzeptieren? Wie kann ich das machen? –

+0

"Also muss ich 'filteredTableData' ändern, um meine Übungsfolge zu akzeptieren" Ich weiß nicht, wovon du redest, sorry. – matt

0

Die beste Lösung ist, bevor der Zugriff der Array-Wert der nur die Gesamtzahl prüfen sollte weniger die der Index, den Sie aus dem Array abrufen möchten oder unten Art und Weise verwenden, um den Array

EX iterieren:

let arrayOfInts: [Int] = [1, 2, 3];   
    for i in arrayOfInts { 
     print(i); 
    } 
In Ihrem Fall

könnten Sie den Code ändern:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    var rowCount = 0 
    if(self.resultSearchController.active){ 
     rowCount = filteredTableData.count 
    } 
    else{ 
     rowCount = exercises.count 
    } 
    return rowCount; 
}