Swift Fatal Error index вне диапазона при использовании панели поиска в табличном представлении - PullRequest
1 голос
/ 27 июня 2019

Я пытаюсь загрузить данные json с tableView, и я хочу добавить данные поиска, используя uiSearchBar, данные хорошо ищутся, но когда я пытаюсь нажать кнопку «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()
        }
    }

"Неустранимая ошибка: индекс вне диапазона 2019-06-27 09: 43: 46.167472 + 0700ImmobiTracker [806: 30114] Неустранимая ошибка: индекс выходит за пределы диапазона "

, что приводит к сбою, все, что я пытаюсь очистить панель поиска ... поэтому, когда я пытаюсь набрать первый раз, чтобы искать его фильтрации данных,но когда я пытаюсь очистить панель поиска, это вылетает

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Есть два места , где вы получаете эту ошибку.

  1. в cellForRowAt:

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

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

Почему

Вы пытаетесь получить элемент из filterProject без использования isSearch, т.е. массив filterPoject пуст. Если isSearch равно false, то возникает ошибка, потому что вы пытаетесь получить элемент из пустого массива.

Как решить эту проблему :

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
}
0 голосов
/ 27 июня 2019
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as? ProjectSumTableCell else {return UITableViewCell()}
    if isSearch {
        if 0..<filterProject.count ~= indexPath.row {
         let proc1 = filterProject[indexPath.row]
         cell.NameLbl.text = proc1.name
        }
    } else {
      if 0..<projectSum.count ~= indexPath.row {
        let proc = projectSum[indexPath.row]
        cell.NameLbl.text = proc.name
      }
    }
    return cell
}

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