在 TableView 中使用搜索栏时,Swift fatal error 索引超出范围

标签 swift tableview searchbar

我尝试用 tableView 加载一个 json 数据,我想使用 uiSearchBar 添加搜索数据,数据搜索很好但是当我尝试点击 searchBar 上的“x”按钮或者当我尝试退格输入时它崩溃了.. .有帮助吗?或者我应该改变我的搜索方法?谢谢您的帮助。我还是 swift 的新手所以如果有更好的搜索方法请告诉我:)

  struct ProjectSumName: Decodable {
     let id : Int
      let name : String

enum CodingKeys : String, CodingKey {
    case id = "id"
    case name = "name"
  }
}


 class ProjectSumController: UIViewController {

  @IBOutlet weak var SearchBar: UISearchBar!
  @IBOutlet weak var ProjectSumTableView: UITableView!

  var projectSum = [ProjectSumName]()
  var filterProject : [ProjectSumName] = [ProjectSumName]()
  var isSearch : Bool = false

  override func viewDidLoad() {
    super.viewDidLoad()
    SearchBar.delegate = self

      Loading()
      let jsonUrl = "http://\(GlobalVariable.ip):7000/api/projectApi?UserId=\(GlobalVariable.UserIdProjectSum)"
    guard let url = URL(string: jsonUrl) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, error) in
        guard let data = data else { return }
        do{
            let projectsum = try JSONDecoder().decode([ProjectSumName].self, from: data)
            self.projectSum = projectsum
            self.filterProject = projectsum
            DispatchQueue.main.async {
                SVProgressHUD.dismiss()
                self.ProjectSumTableView.reloadData()
            }
        }catch {
            print(error)
        }
    }.resume()
  }
} 



   extension ProjectSumController : UISearchBarDelegate,  UITableViewDelegate,UITableViewDataSource{


   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if isSearch{
        return filterProject.count
    }else{
        return projectSum.count
    }
}
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let proc = projectSum[indexPath.row]
    let proc1 = filterProject[indexPath.row]
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? ProjectSumTableCell else {return UITableViewCell()}

    if isSearch{
        cell.NameLbl.text = proc1.name
    }else{
        cell.NameLbl.text = proc.name
    }
    return cell
}

   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let sum = projectSum[indexPath.row]
    let sum1 = filterProject[indexPath.row]

    if isSearch{
        performSegue(withIdentifier: "Segue", sender: sum1)
        let projectIDs = sum1.id
        GlobalVariable.ProjectId = String(projectIDs)
    }else{
        performSegue(withIdentifier: "Segue", sender: sum)
        let projectID = sum.id
        GlobalVariable.ProjectId = String(projectID)
    }
}

 func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

        if searchText.isEmpty{
            self.isSearch = false;
            self.ProjectSumTableView.reloadData()
        } else {
            self.filterProject = self.projectSum.filter({  (ProjectSumName) -> Bool in

                let tmp : NSString = NSString.init(string: ProjectSumName.name)
                let range = tmp.range(of: searchText, options: NSString.CompareOptions.caseInsensitive)

                return range.location != NSNotFound && range.location == 0
            })
            if(self.filterProject.count == 0){
                self.isSearch = false;
            }else{
                self.isSearch = true;
            }
            self.ProjectSumTableView.reloadData()
        }
    }

“ fatal error :索引超出范围 2019-06-27 09:43:46.167472+0700 ImmobiTracker[806:30114] fatal error :索引超出范围”

当我试图清除我的搜索栏时,崩溃出现了......所以当我第一次尝试键入以搜索它过滤数据时,但是当我尝试清除搜索栏时它弹出崩溃

最佳答案

您在两个地方遇到此错误。

  1. 在 cellForRowAt 中:

    let proc = projectSum[indexPath.row]
    let proc1 = filterProject[indexPath.row]
    
  2. didSelectRowAt

    let sum = projectSum[indexPath.row]
    let sum1 = filterProject[indexPath.row]
    

为什么:

您试图在不使用 isSearch 的情况下从 filterProject 获取元素,即 filterPoject 数组为空。当 isSearchfalse 时,会发生错误,因为您正试图从空数组中获取元素。

如何解决这个问题:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let sum: ProjectSumName
    if isSearch{
        sum = filterProject[indexPath.row]
    }else{
        sum = projectSum[indexPath.row]
    }
    GlobalVariable.ProjectId = String(sum.id)
    performSegue(withIdentifier: "Segue", sender: sum)
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? ProjectSumTableCell else {return UITableViewCell()}

    let proc: ProjectSumName
    if isSearch{
        proc = filterProject[indexPath.row]
    }else{
        proc = projectSum[indexPath.row]
    }
    cell.NameLbl.text = proc.name
    return cell
}

关于在 TableView 中使用搜索栏时,Swift fatal error 索引超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56783417/

相关文章:

javascript - For 数组上的循环不起作用。如何修复它?

ios - 为什么我的搜索栏不起作用?

ios - 如何使用 Watchkit 进行异步操作(GPS + API 调用)和

swift - 在 Swift 中指定协议(protocol)之间的关系

swift - AdMob 是否使用 IDFA?

JavaFX:向 TableView 数据添加后缀并保持正确的排序

ios - 滚动单元格双端队列时如何维护和保存自定义单元格文本字段输入数据

uiview - SearchController 的 searchBar 添加为 UIView subview 未正确(重新)调整大小

ios - 这是 iOS 的哪个 UI 元素?

ios - 在 iOS 模拟器中移动元素