Swift - 清除TableView

时间:2015-10-27 21:28:01

标签: swift2

我有一个搜索,它下载一个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
}

3 个答案:

答案 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();