问题描述
我有一个工作正常的表格视图。但是,当我尝试实现 UISearchBar 并显示过滤后的数据时,没有过滤任何内容。这是我的视图控制器:
import UIKit
class MealPlanViewController: UIViewController,UISearchBarDelegate {
private var model = MealPlanModel()
private var mealPlan = [MealPlan]()
var filteredData: [MealPlan]!
@IBOutlet weak var topBarStackView: UIStackView!
@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
model.delegate = self
searchBar.delegate = self
filteredData = mealPlan
}
func searchBar(_ searchBar: UISearchBar,textDidChange searchText: String) {
filteredData = []
if searchText == "" {
filteredData = mealPlan
}
else {
for item in mealPlan {
if ((item.title?.lowercased().contains(searchText.lowercased())) != nil) {
filteredData.append(item)
}
}
}
self.tableView.reloadData()
}
}
extension MealPlanViewController: UITableViewDelegate,UITableViewDataSource {
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return filteredData.count
}
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MealPlanCell",for: indexPath) as! MealPlanCell
let filteredMealPlaninTable = filteredData[indexPath.row]
cell.displayMealPlan(filteredMealPlaninTable)
return cell
}
}
extension MealPlanViewController: MealPlanProtocol {
func mealPlansRetrieved(mealPlans: [MealPlan]) {
self.filteredData = mealPlans
tableView.reloadData()
}
}
一些注意事项:
- 当我在我的 `func mealPlansRetrieved' 中运行
print(self.filteredData)
时,控制台返回我的所有数据,就好像它没有被过滤一样,但是 - 一旦我开始在搜索栏中输入,表格视图就不会返回任何单元格,这似乎与上述内容相矛盾
作为参考,这是过滤前的代码,确实有效:
extension MealPlanViewController: UITableViewDelegate,numberOfRowsInSection section: Int) -> Int {
return mealPlan.count
}
func tableView(_ tableView: UITableView,for: indexPath) as! MealPlanCell
let mealPlanInTable = mealPlan[indexPath.row]
cell.displayMealPlan(mealPlanInTable)
return cell
}
}
extension MealPlanViewController: MealPlanProtocol {
func mealPlansRetrieved(mealPlans: [MealPlan]) {
self.mealPlan = mealPlans
tableView.reloadData()
}
}
非常感谢任何帮助/指导!
解决方法
Contains 返回布尔值,所以这永远不会失败: item.title?.lowercased().contains(searchText.lowercased())) != nil
要进行检查,您只需删除“!= nil”即可。
我不确定您从哪里调用 mealPlansRetrieved,但您可能希望保留“self.mealPlan =mealPlans”而不是“self.filteredData =mealPlans”这一行。