UISearchController returns 部分而不是过滤的 tableview 项目

UISearchController returns section instead of the filtered tableview item

我已经实施了 SearchController,当我使用 SearchController 搜索食品时,它 return 是整个部分。

例如,我将使用 SearchController 搜索 Chocolate,它会 return 并导致 tableView 显示 Sweets 的整个部分,而不仅仅是Chocolate,它也会 return Lollipops。我在这里做错了什么?我是 swift 的新手,我们将不胜感激。谢谢。

struct Food {
    let foodTaste: String
    let foodList: [String]
}

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating {

    func updateSearchResults(for searchController: UISearchController) {
        if searchController.searchBar.text! == "" {
            filteredFood = food
        } else {
            filteredFood = food.filter { [=11=].foodList.contains(where: { [=11=].contains(searchController.searchBar.text!) }) }
            self.tableView.reloadData()  
        }  
    }

    var tableView = UITableView()
    var food = [Food]()
    var filteredFood = [Food]()

    let searchController = UISearchController(searchResultsController: nil)

    override func viewDidLoad() {
        super.viewDidLoad()

        filteredFood = food
        searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false
        tableView.tableHeaderView = searchController.searchBar
        definesPresentationContext = true
        tableView.frame = self.view.frame
        self.view.addSubview(tableView)

        tableView.delegate = self
        tableView.dataSource = self

        let sweets = Food(foodTaste: "Sweet", foodList: ["Chocolate", 
        "Lollipops"])
        let sour = Food(foodTaste: "Sour", foodList: ["Lemon", "Limes"])
        food.append(sweets)
        food.append(sour)
    }


    func numberOfSections(in tableView: UITableView) -> Int {
        return filteredFood.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return filteredFood[section].foodList.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
        cell.textLabel?.text = filteredFood[indexPath.section].foodList[indexPath.row]
        return cell
    }

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return filteredFood[section].foodTaste
    }

    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        return 4
    }


}

公交车在排队

        filteredFood = food.filter { [=10=].foodList.contains(where: { [=10=].contains(searchController.searchBar.text!) }) }

实际上你的 foodfilteredFood 是一个二维数组。第一维是数组本身。第二个 - Food 对象内的内部数组 foodList。此代码仅过滤此数据结构的外部维度。它说如果在 foodList 中有匹配搜索的字符串,那么整个 Food 对象应该通过过滤器。如果这不是您想要的 - 您还必须创建新的 Food 对象。大概是这样的:

        filteredFood = food.filter { [=11=].foodList.contains(where: { [=11=].contains(searchController.searchBar.text!) }) }
                           .map  { Food(foodTaste: [=11=].foodTaste, foodList: [=11=].foodList.filter( {[=11=].contains(searchController.searchBar.text!) }) }