2017-02-09 13 views
1

Я создал несколько строковых поисков в моей базе данных, и я возвращаю JSON после того, как пользователь нажимает третий символ в строке поиска, после чего я добавляю все результаты в массив и он заполняет таблицу с данными.Строка поиска Swift - обновление табличного представления с запросом Alamofire

Хотя я имею дело с проблемой. Когда я ищу позволяет сказать mens получить результаты появляются на Tableview

Если я удалить весь текст и я пишу женщин, все хорошо ... но когда я удалить некоторые строки и т.д. я получаю сообщение об ошибке index out of range внутри tableview cellForRowAt. Я предполагаю, что он ломается, потому что табличное представление не имеет времени, чтобы получить добавленный массив и заполнить ячейки.

Что я пытаюсь выяснить, как я могу заставить его работать, БЕЗ установки временной задержки по запросу или в reloadData(). Причина, по которой я не хочу задерживать время, состоит в том, что у некоторых пользователей может быть медленный iPhone и даже с задержкой в ​​2 секунды, это может привести к сбою.

Это мой код

class SearchViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UISearchControllerDelegate{ 

@IBOutlet weak var searchResultTable: UITableView! 
    let searchController = UISearchController(searchResultsController: nil) 

    var filteredData = [Products]() 

override func viewDidLoad() { 
     super.viewDidLoad() 


     self.navigationController?.isNavigationBarHidden = true 
     searchController.searchResultsUpdater = self 
     searchController.dimsBackgroundDuringPresentation = false 
     definesPresentationContext = true 
     searchResultTable.tableHeaderView = searchController.searchBar 

     searchController.searchBar.delegate = self 

    } 


func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 
     searchBar.resignFirstResponder() 
    } 


    func getSearch(completed: @escaping DownloadComplete, searchString: String) { 
     if filteredData.isEmpty == false { 
      filteredData.removeAll() 
     } 
     let parameters: Parameters = [ 
      "action" : "search", 
      "subaction" : "get", 
      "product_name" : searchString, 
      "limit" : "0,30" 
     ] 


     Alamofire.request(baseurl, method: .get, parameters: parameters).responseJSON { (responseData) -> Void in 
      if((responseData.result.value) != nil) { 
       let result = responseData.result 

       if let dict = result.value as? Dictionary<String, AnyObject>{ 
        if let list = dict["product_details"] as? [Dictionary<String, AnyObject>] { 

         for obj in list { 
          let manPerfumes = Products(productDict: obj) 
          self.filteredData.append(manPerfumes) 
         } 


        } 
       } 
       completed() 
      } 
     } 
    } 


func numberOfSections(in tableView: UITableView) -> Int { 

     return 1 

    } 
    func tableView(_ tableView: UITableView, 
        heightForRowAt indexPath: IndexPath) -> CGFloat { 
     return 170 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return filteredData.count 
    } 

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

      let cell:iPhoneTableViewCell = tableView.dequeueReusableCell(withIdentifier: "iPhoneTableCell", for: indexPath) as! iPhoneTableViewCell 

      let prods = self.filteredData[indexPath.row] //HERE I GET THE ERROR 
      cell.configureCell(products: prods) 

      return cell 

    } 

} 

extension SearchViewController: UISearchResultsUpdating { 

    func updateSearchResults(for searchController: UISearchController) { 

     if (searchController.searchBar.text?.characters.count)! >= 3 { 
        self.getSearch(completed: { 
        self.searchResultTable.reloadData() 

        self.searchResultTable.setContentOffset(CGPoint.zero, animated: true) 
       }, searchString: searchController.searchBar.text!) 
     } else { 
      self.searchResultTable.reloadData() 
     } 


    } 
} 

ответ

1

Похоже, вы меняете состояние из filteredData в то время как Tableview делает reloadData. Если numberOfRowsForSection возвращает 3, а затем пользователь нажимает клавишу удаления, например, размер массива станет 0. Возможно, поэтому cellForRow генерирует исключение при запросе индексов 0,1 или 2.

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

  • Нет связанных вопросов^_^