Swift UiTableView没有重新加载搜索结果

时间:2017-09-25 07:26:19

标签: swift xcode

我有一个奇怪的问题,由于某种原因我的UITableView在执行搜索后没有重新加载。控制台打印出正确过滤的数据,但表格不会更改。我从未遇到过这个问题,所以我首先尝试了自然会想到的解决方案:

  1. 在主要队列中尝试了tableView.reloadData()

  2. 退出Xcode,清理构建,重新安装

  3. 清除派生数据目录
  4. 我在SO中发现了几个类似的问题,但我见过的所有解决方案都是我尝试过的,主要是在主队列中重新加载tableview。

    希望我的代码中只有一个问题,或者我缺少的东西。

    我正在运行Xcode 8.3.3

    import UIKit
    
    class CategoriesViewController: UIViewController {
    
    var isFiltering = false
    var location = Location()
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var searchBar: UISearchBar!
    var categoriesSearchResults = [Category]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        tableView.allowsSelection = true
        tableView.keyboardDismissMode = .onDrag
        let nib = UINib(nibName: "CategoryTableViewCell", bundle: nil)
        self.tableView.register(nib, forCellReuseIdentifier:"CategoryTableViewCell");
        searchBar.returnKeyType = UIReturnKeyType.done
        searchBar.autocapitalizationType = .none
        searchBar.delegate = self
    }
    
    
    extension CategoriesViewController : UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 60
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("HI")
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    
        if isFiltering {
            return self.categoriesSearchResults.count
        }
    
        return self.location.categories.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        if let cell = self.tableView.dequeueReusableCell(withIdentifier: "CategoryTableViewCell", for: indexPath) as? CategoryTableViewCell {
            var category: Category
            if isFiltering {
                category = self.categoriesSearchResults[indexPath.row]
            } else {
                category = self.location.categories[indexPath.row]
            }
            cell.name.text = category.name
            cell.status.textColor = UIColor.lightGray
            cell.status.text = "Not Verified"
        }
    
        return cell
    }
    }
    
    extension CategoriesViewController : UISearchBarDelegate {
    
    func searchBarIsEmpty() -> Bool{
        return self.searchBar.text?.isEmpty ?? true
    }
    
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        self.isFiltering = true
        self.categoriesSearchResults.removeAll()
        tableView.reloadData()
        self.view.endEditing(true)
    }
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if searchBarIsEmpty() {
            self.view.endEditing(true)
            self.isFiltering = false
        } else {
            self.isFiltering = true
            self.categoriesSearchResults = self.location.categories.filter({ (category: Category) -> Bool in
                return category.name.lowercased().contains(searchText.lowercased())
            })
        }
        tableView.reloadData()
    }
    }
    

    和我的自定义表格视图单元格:

    import UIKit
    
    class CategoryTableViewCell: UITableViewCell {
    @IBOutlet weak var name: UILabel!
    @IBOutlet weak var status: UILabel!
    
    override func awakeFromNib() {
        super.awakeFromNib()
    
    }
    
    override func prepareForReuse() {
        super.prepareForReuse()
        self.name.text   = ""
        self.status.text = ""
    }
    
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    
        // Configure the view for the selected state
    }
    
    }
    

    提前谢谢。

    编辑:也值得一提,当我正在积极搜索时,函数tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)未被调用?

1 个答案:

答案 0 :(得分:1)

if let的范围在其范围内。在您的代码中,您始终返回let cell = UITableViewCell()。尝试在if let

中返回
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    if let cell = self.tableView.dequeueReusableCell(withIdentifier: "CategoryTableViewCell", for: indexPath) as? CategoryTableViewCell {
        var category: Category
        if isFiltering {
            category = self.categoriesSearchResults[indexPath.row]
        } else {
            category = self.location.categories[indexPath.row]
        }
        cell.name.text = category.name
        cell.status.textColor = UIColor.lightGray
        cell.status.text = "Not Verified"

        /// RETURN CELL HERE
        return cell

    }

    return cell
}