2017-02-09 10 views
1

Ich habe einige String-Suche in meiner Datenbank gemacht und ich gebe den JSON zurück, nachdem der Benutzer das dritte Zeichen auf Suchleiste drückt, danach füge ich alle Ergebnisse an ein Array und es füllt eine Tabellenansicht mit Daten.Swift Suchleiste - Aktualisieren der Tabellenansicht mit Alamofire Anfrage

Obwohl ich ein Problem habe. Wenn ich für mens können sagen, suchen erhalte ich die Ergebnisse auf dem Tableview erscheinen

Wenn ich den ganzen Text löschen und ich schreiben Frauen, die alle gut ... aber wenn ich ein paar Strings etc ich einen Fehler zu löschen bin index out of range innen die Tabellenansicht cellForRowAt. Ich denke, dass es kaputt ist, weil die Tabellenansicht nicht die Zeit hat, das angehängte Array zu bekommen und die Zellen zu füllen.

Was ich herausfinden möchte ist, wie kann ich es machen, ohne eine Zeitverzögerung auf die Abfrage oder in der reloadData(). Der Grund, warum ich keine Zeitverzögerung möchte, liegt darin, dass ein Benutzer ein langsames altes iPhone haben könnte und sogar mit 2 Sekunden Verzögerung könnte es abstürzen.

Dies ist mein Code

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() 
     } 


    } 
} 

Antwort

1

Es sieht aus wie Sie den Zustand der filteredData verändern, während die Tableview reloadData tut. Wenn numberOfRowsForSection 3 zurückgibt und der Benutzer dann zum Beispiel den Löschschlüssel anklickt, wird die Arraygröße zu 0. Das ist der Grund, warum cellForRow eine Exception auslöst, wenn Index 1 oder 2 angefordert wird.

Verwandte Themen