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 中,您引用了一个名为fetchedResultsControllerelse

var fetchedResultsController = ...

这是两个完全不同的对象。

事实是两者都是错误的。每次调用表视图数据源来考虑一行时,您都不应该进行获取。看看 Xcode 应用程序模板是如何工作的!有一个提取结果控制器,永久。它进行一次获取,然后就坐在那里保存数据。这才是你应该做的。

【讨论】:

以上是关于TableView 的 SearchBar 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 searchBar 和 tableview 之间添加空格?

ios objective-c tableView searchBar

在 TableView 上添加 SearchBar

如何从 SearchBar 中获取 Tableview 中所有项目的当前项目的索引

问:带有 JSON 文件的 SearchBar Tableview

用户点击 SearchBar 时如何使 TableView 不透明