2015-10-27 5 views
5

Ho una ricerca che scarica un file JSON e visualizza i risultati in un TableView. Se l'utente cerca qualcosa e ottiene un elenco di risultati, cerca qualcos'altro che restituisce 0 risultati. Il primo set di risultati è ancora in TableView. Voglio cancellare TableView ogni volta che inizia una nuova ricerca per evitare che ciò accada. Ho provato a impostare l'origine dati su zero e ricaricare il TableView ma non funziona. Ecco cosa ho:Swift - Clear TableView

var searchResults : [[String : AnyObject]]? = nil 

func searchBarSearchButtonClicked(searchBar: UISearchBar) { 
    print("DEBUG: searchBarSearchButtonClicked") 
    if searchBar.text > "" { 

     //--- This isn't working --- 
     searchResults = nil 
     tableView.reloadData() 
     //-------------------------- 

     activityIndicator.startAnimating() 

     dbSearcher.startSearch(searchBar.text!) { (results) ->() in 
      self.searchResults = results 
      self.activityIndicator.stopAnimating() 
      self.tableView.reloadData() 
     } 

     searchBar.endEditing(true) 
    } 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if searchResults != nil { 
     print("DEBUG: Result count \(searchResults!.count)") 
     return searchResults!.count 
    } else { 
     print("DEBUG: Result count 0") //I don't see this other than when the ViewController first loads 
     return 0 
    } 

} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("searchResult")! 
    cell.textLabel?.text = searchResults![indexPath.row]["Title"] as? String 
    cell.detailTextLabel?.text = searchResults![indexPath.row]["Year"] as? String 

    //Display cover 
    let imageURL = searchResults![indexPath.row]["Poster"] as? String 
    if imageURL != "N/A" { 

     if let cover : UIImage = searchResults![indexPath.row]["Image"] as? UIImage { 
      cell.imageView?.image = cover 
     } else { 
      //Use default cover while the correct image downloads 
      //cell.imageView?.image = DEFAULT_COVER 
      downloadCover(imageURL!, tableViewRow: indexPath.row) 
     } 

    } else { 
     //Use default cover 
     //cell.imageView?.image = DEFAULT_COVER 
    } 

    return cell 
} 
+0

Ho provato il modo in cui si ripristina la vista tabella e funziona per me. Il tavolo si svuota. Nella tua domanda scrivi che hai impostato il tuo data source a zero. Lo fai ancora da qualche altra parte? – joern

+0

No, lo faccio solo in searchBarSearchButtonClicked (...). Quando dico di averlo impostato su zero, intendo dove creo tempDict come dizionario nil e imposto searchResults = tempDict. Ho provato a fare searchResults = nil ma mi ha dato un errore. – Daniel

+0

Che tipo di errore si verifica quando si tenta di impostare 'searchResults = nil'? Non dovrebbe causare un errore. – joern

risposta

9

Non utilizzare un tipo opzionale.
Dichiarare un array vuoto non facoltativo.

var searchResults : [[String : AnyObject]]() 

poi numberOfRowsInSection può essere solo

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return searchResults.count 
} 

Per cancellare la visualizzazione della tabella di scrittura

searchResults.removeAll() 
tableView.reloadData() 

No unwrapping, nessun controllo per nil, nessun problema.

+0

Ho trovato il problema, è stata colpa mia. Ho dimenticato di cancellare i risultati che vengono trasferiti nel callback da dbSearcher.startSearch (...). Ho cambiato la variabile come suggerito comunque, grazie. L'unica differenza è che deve essere dichiarato come var searchResults: [[String: AnyObject]] = [] – Daniel

1

Questo post è stato molto tempo fa, ma per chiunque fosse interessato, ecco cosa uso nella mia app.

Se davvero si vuole utilizzare la funzione deleteRows (per scopi di animazione per esempio), allora si può fare quanto segue:

let count = self.tableView(self.tableView, numberOfRowsInSection: 0) 
// insert action that deletes all your data from the model here 
// e.g. self.arrayOfRows = [] 
self.tableView.deleteRows(at: (0..<count).map({ (i) in IndexPath(row: i, section: 0)}), with: .automatic) 

Ciò che fondamentalmente fa è convertire la gamma 0..<count a [IndexPath] valori e incarica la tabella per cancellare quei percorsi, usando il metodo deleteRows.