2016-08-11 22 views
1

Я случайно получаю ошибку «index out of range» в моем представлении таблицы, которую я использую для функции поиска.swift - cellforrowindexpath "index out the range" error

Он врезается в cell.article = self.searchResults?[indexPath.row]

99% времени он работает, но иногда даже если я использую тот же поисковый запрос дает эту ошибку и вылетает.

func updateSearchResultsForSearchController(searchController: UISearchController) 
    { 
     self.searchResults?.removeAll(keepCapacity: false) 
     if (!searchController.searchBar.text!.isEmpty){ 
      let query = ["q" : searchController.searchBar.text] 
      let start = 1 
      let size = 15 
      let index = "articles" 
      let parameters : [String : AnyObject] = ["index": index, "query": String(query), "start": start, "size": size] 
      let url = "http://api.url" 
      Alamofire.request(.POST, url, parameters: parameters) 
       .responseJSON { response in 
        guard response.result.error == nil else { 
         print(response.result.error!) 
         debugPrint(response) 
         return 
        } 
        if let value: AnyObject = response.result.value { 
         let search = JSON(value) 
         if let data = search["articles"].arrayValue as [JSON]?{ 
          self.searchResults = data 
          self.view.hideLoading() 
          self.tableView.reloadData() 
         } 
        } 
      } 
     } 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
      let cell = tableView.dequeueReusableCellWithIdentifier("SearchCell") as! SearchTableViewCell   
      let gesture = UILongPressGestureRecognizer(target: self, action: #selector(SearchTableViewController.longPressCell(_:))) 
      gesture.minimumPressDuration = 0.5 
      cell.addGestureRecognizer(gesture) 

      cell.article = self.searchResults?[indexPath.row] ---> "EXC_BREAKPOINT" here. 
      cell.authorButton.tag = indexPath.row 

      return cell 
     } 
+0

можете ли вы опубликовать свой метод numberOfRowsInSection? – Miknash

+0

После асинхронного запроса предполагается, что вид таблицы должен быть перезагружен в основном потоке – vadian

+0

Я предполагаю, что проблема заключается в том, что массив 'searchResults' не содержит строку, которая соответствует' indexPath.row'. Например, если 'searchResults' содержит только 1 элемент и ваш' indexPath.row' = 2, вы увидите этот сбой. Возможно, вам следует попытаться отладить то, что содержит ваши 'searchResults', когда он сбой. – pbodsk

ответ

2

Проблема заключается в том, когда вы удаляете все данные

self.searchResults?.removeAll(keepCapacity: false) 

вы не перезаряжать tableView, и до тех пор, пока self.tableView.reloadData() будет называться в Alamofire завершения вашей tableView может привести к сбою. Вы можете перезагрузить tableView сразу после удаления элементов или просто не удалять их, они будут в любом случае превышены новым по завершении Alamofire.

+1

Я думаю, что это решает мою проблему, мне нужно проверить больше, чтобы реплицировать проблему. Спасибо, Тень. –

Смежные вопросы