我得到错误"索引6超出界限[0 .. 5]' "在我的应用程序中实现搜索时

时间:2016-05-23 14:47:57

标签: swift uitableview tableview uisearchbar

这是我的代码。在关于如何在Swift中实现搜索的多个教程之后,我没有运气。

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.
}

我在从不同教程中实施搜索时遇到了麻烦,而且似乎没有做得太好。非常感谢任何见解。

2 个答案:

答案 0 :(得分:1)

您的numberOfRowsInSection始终返回exercises.count。但是当您进行过滤时,您不是使用exercises,而是使用较小的数组filteredTableData。因此,就像在cellForRowAtIndexPath中一样,如果要过滤,则需要更改答案。

答案 1 :(得分:0)

最好的解决方案是在访问数组值之前,只需检查总计数应该少于您希望从数组中获取的索引,或者使用以下方式迭代数组

EX:

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

在您的情况下,您可以更改代码:

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;
}