我有一个搜索,它下载一个JSON文件并在TableView中显示结果。如果用户搜索某些内容并获取结果列表,则搜索返回0结果的其他内容。第一组结果仍然在TableView中。我想在每次新搜索开始时清除TableView以防止发生这种情况。我已经尝试将数据源设置为nil并重新加载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 :(得分:19)
请勿使用可选类型。
声明一个非可选的空数组。
var searchResults : [[String : Any]]()
然后numberOfRowsInSection
可以只是
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return searchResults.count
}
清除表格视图写入
searchResults.removeAll()
tableView.reloadData()
没有展开,没有检查nil
,没有问题。
答案 1 :(得分:1)
这篇文章很久以前,但对于任何有兴趣的人,这都是我在我的应用程序中使用的。
如果您真的想使用deleteRows
函数(例如用于动画),那么您可以执行以下操作:
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)
它基本上做的是将范围0..<count
转换为[IndexPath]
值,并使用deleteRows
方法指示表格视图删除这些路径。
答案 2 :(得分:-2)
尝试一下:
tableView.getItems().clear();