代码之家  ›  专栏  ›  技术社区  ›  Abisanth11

TableView的搜索栏不工作

  •  -1
  • Abisanth11  · 技术社区  · 7 年前

    我试图在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
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   matt    7 年前

    问题是这一行:

    let fetchedResultsController = NSFetchedResultsController(...
    

    let 意味着这是一个局部变量。因此,您创建了一个新的获取结果控制器,然后将其丢弃。

    与此同时,在你的 cellForRowAt ,你指的是什么 其他的 打电话 fetchedResultsController :

    var fetchedResultsController = ...
    

    这是两个完全不同的物体。

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