TableView 的 SearchBar 不起作用
Posted
技术标签:
【中文标题】TableView 的 SearchBar 不起作用【英文标题】:SearchBar of TableView doesn't work 【发布时间】:2017-11-21 20:00:11 【问题描述】:我正在尝试将 SearchBar 添加到 TableView,它使用 CoreData 存储其数据。但是当我尝试搜索 TableView 时没有更新。我认为 fetch 正在工作,但表没有被更新。
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
if searchText.isEmpty
return
else
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let sRequest: NSFetchRequest<Note> = Note.fetchRequest()
sRequest.predicate = NSPredicate(format: "SELF.title CONTAINS[cd] %@", searchText)
sRequest.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)]
let fetchedResultsController = NSFetchedResultsController(fetchRequest: sRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
print(sRequest)
do
try fetchedResultsController.performFetch()
catch
fatalError("Failed to fetch entities: \(error)")
self.mainTable.reloadData()
return
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell:UITableViewCell = mainTable.dequeueReusableCell(withIdentifier: "prototypeCell")!
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let tableRequest: NSFetchRequest<Note> = Note.fetchRequest()
tableRequest.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false)]
var fetchedResultsController = NSFetchedResultsController(fetchRequest: tableRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
do
try fetchedResultsController.performFetch()
catch
fatalError("Failed to fetch entities: \(error)")
let noteCell = fetchedResultsController.object(at: indexPath)
cell.textLabel?.text = noteCell.title!
let formatter = DateFormatter()
formatter.dateFormat = "d.M.y, HH:mm"
let dateString = formatter.string(from: noteCell.date! as Date)
cell.detailTextLabel?.text = dateString
return cell
【问题讨论】:
您能否提供您的cellForRowAtIndexPath
代码?
更新:添加了 cellForRowAt
【参考方案1】:
问题出在这一行:
let fetchedResultsController = NSFetchedResultsController(...
let
表示这是一个局部变量。因此,您创建了一个新的获取结果控制器,然后将其丢弃。
同时,在您的cellForRowAt
中,您引用了一个名为fetchedResultsController
的else:
var fetchedResultsController = ...
这是两个完全不同的对象。
事实是两者都是错误的。每次调用表视图数据源来考虑一行时,您都不应该进行获取。看看 Xcode 应用程序模板是如何工作的!有一个提取结果控制器,永久。它进行一次获取,然后就坐在那里保存数据。这才是你应该做的。
【讨论】:
以上是关于TableView 的 SearchBar 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 searchBar 和 tableview 之间添加空格?
ios objective-c tableView searchBar
如何从 SearchBar 中获取 Tableview 中所有项目的当前项目的索引