swift2 Swift -清除表视图

fiei3ece  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(211)

我有一个下载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
}
0lvr5msh

0lvr5msh1#

不要使用可选类型。

宣告非选择性的空数组。

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

那么numberOfRowsInSection可以是

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

要清除表视图,请写入

searchResults.removeAll()
tableView.reloadData()

无需解包,无需检查nil,没有问题。

a1o7rhls

a1o7rhls2#

这篇文章是很久以前的事了,但对于任何感兴趣的人来说,这里是我在我的应用程序中使用的东西。
如果确实要使用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方法删除这些路径。

2j4z5cfb

2j4z5cfb3#

试试看:

tableView.getItems().clear();

相关问题