我收到错误:致命错误:索引超出范围

Posted

技术标签:

【中文标题】我收到错误:致命错误:索引超出范围【英文标题】:I get the Error: Fatal error: Index out of range 【发布时间】:2020-05-19 22:54:01 【问题描述】:

我正在尝试创建一个连接到我的 tableview 的搜索栏,但是当我运行它时,当单击“返回 searchArray”行上的搜索栏时,我收到一条错误消息,提示“致命错误:索引超出范围” [部分].rowTitles.count'。我该如何解决?有什么想法吗?

这是我的代码:

class ViewController: UIViewController 

    @IBOutlet weak var searchBar: UISearchBar!
    @IBOutlet weak var tableView: UITableView!

    struct data 
        var sectionTitle = String()
        var rowTitles = [String]()
    

    var dataArray = [data(sectionTitle: "section 1", rowTitles: ["row 1", "row 2", "row 3"]),
        data(sectionTitle: "section 2", rowTitles: ["row 1", "row 2"]),
        data(sectionTitle: "section 3", rowTitles: ["row 1"])
       ]
    var searchArray = [(sectionTitle: String, rowTitles: [String])]()
    var searching = false

    override func viewDidLoad() 
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
    


extension ViewController: UITableViewDelegate, UITableViewDataSource 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        if searching 
            return searchArray[section].rowTitles.count
         else 
            return dataArray[section].rowTitles.count
        
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "searchCell")
        if searching 
            cell?.textLabel?.text = self.searchArray[indexPath.section].rowTitles[indexPath.row]
         else 
            cell?.textLabel?.text = self.dataArray[indexPath.section].rowTitles[indexPath.row]
        
        return cell!
    
    func numberOfSections(in tableView: UITableView) -> Int 
        return dataArray.count
    

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
        if searching 
        return searchArray.count
         else 
        return dataArray[section].sectionTitle
        
    



extension ViewController: UISearchBarDelegate 
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
        if searchBar.text == nil || searchBar.text == "" 
            searching = false
            view.endEditing(true)
            tableView.reloadData()
         else 
            searching = true
            searchArray = dataArray.filter($0.sectionTitle == searchBar.text)
            tableView.reloadData()
        
    

【问题讨论】:

【参考方案1】:

首先你应该有

var searchArray = [data]()

然后

extension ViewController2: UISearchBarDelegate 
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
        if searchBar.text == nil || searchBar.text == "" 
            searching = false
            view.endEditing(true)
            tableView.reloadData()
         else 
            searching = true
           searchArray = dataArray.filter($0.sectionTitle.lowercased().contains(searchBar.text!.lowercased()) || $0.rowTitles.map$0.lowercased().contains(searchBar.text!.lowercased()) )
            tableView.reloadData()
        
    

【讨论】:

你在搜索什么? 索引超出范围意味着您正在访问不在数组中的元素 func numberOfSections(in tableView: UITableView) -> Int return dataArray.count 用搜索和非搜索更新这个方法 搜索部分 1 完全匹配的结果

以上是关于我收到错误:致命错误:索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

Swift TableView ImageView + Label = 致命错误:索引超出范围

从数组中删除 - 致命错误:索引超出范围 - SwiftUI 绑定

致命错误:索引超出范围tableview

在 ForEach 循环中删除项目会导致致命错误:索引超出范围

辅助选择器的“ForEach”给了我致命错误:索引超出范围

准备转场时致命错误索引超出范围