在我的应用程序中实现搜索时出现错误“索引 6 超出范围 [0 .. 5]”

Posted

技术标签:

【中文标题】在我的应用程序中实现搜索时出现错误“索引 6 超出范围 [0 .. 5]”【英文标题】:I get the error "index 6 beyond bounds [0 .. 5]' " when implementing search in my app 【发布时间】:2016-05-23 14:47:57 【问题描述】:

这是我的代码。在遵循多个关于如何在 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.

我在执行不同教程中的搜索时遇到了麻烦,而且似乎效果不太好。非常感谢任何见解。

【问题讨论】:

【参考方案1】:

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

【讨论】:

所以我需要更改 'filteredTableData' 来接受我的练习字符串?我该怎么做? "所以我需要更改 'filteredTableData' 以接受我的练习字符串" 我不知道你在说什么,对不起。【参考方案2】:

最好的解决方案是在访问数组值之前检查总计数应该小于您要从数组中获取的索引或使用以下方式来迭代数组

前:

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;

【讨论】:

以上是关于在我的应用程序中实现搜索时出现错误“索引 6 超出范围 [0 .. 5]”的主要内容,如果未能解决你的问题,请参考以下文章

尝试实现搜索栏时出现 Swift 错误

尝试使用可达性时出现错误

尝试在我的 RoR 项目上“安装包”时出现错误。 [视窗 8]

添加 firebase 后构建 Flutter apk 时出现 Gradle 错误

发生冲突后在哈希表中实现链接时出现分段错误

我正在尝试在我的应用程序中实现搜索栏,以便我可以搜索从 parse.com 检索到的对象