核心数据 nstableview 搜索栏

core data nstableview searchbar

我有一个 nstableview,其中填充了核心数据。

NSManagedObject

import Foundation
import CoreData

@objc(Person)
public class Person: NSManagedObject { 
    @NSManaged public var firstName: String
    @NSManaged public var secondName: String
}

RequestData

 func requestData() {
        let appdelegate = NSApplication.shared().delegate as! AppDelegate
        let context = appdelegate.persistentContainer.viewContext
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Person")

        do {
            person = try context.fetch(request) as! [Person]
            tableViewn.reloadData()
        } catch { }
    }

我的 tableView 也有一个自定义单元格视图。 我这样填写数据:

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {

        let view = tableView.make(withIdentifier: "Cell", owner: self) as? CustomCell

        view?.txtfirstName.stringValue = person.firstName
        view?.txtsecondName.stringValue = person.secondName
        return view
}

现在我想实现一个搜索栏(我已经在我的视图控制器中),用于使用名字或第二个名字进行搜索。

但我不知道如何实现这一点。

  • NSSearchField 的委托设置为目标 class
  • 实施controlTextDidChange

    override func controlTextDidChange(_ notification: Notification) {
        if let field = notification.object as? NSSearchField {
            let query = field.stringValue
            let predicate : NSPredicate?
            if query.isEmpty {
                predicate = nil
            } else {
                predicate = NSPredicate(format: "firstName contains[cd] %@ OR lastName contains[cd] %@", query, query)
            }
            requestData(with: predicate) 
        } else {
            super.controlTextDidChange(notification)
        }
    }
    
  • requestData改为

    func requestData(with predicate : NSPredicate? = nil) {
        let appdelegate = NSApplication.shared().delegate as! AppDelegate
        let context = appdelegate.persistentContainer.viewContext
        let request = NSFetchRequest<Person>(entityName: "Person")
        request.predicate = predicate
    
        do {
            person = try context.fetch(request)
            tableViewn.reloadData()
        } catch { }
    }
    

旁注:

如果您使用 NSManagedObject subclasses 创建更具体的获取请求 NSFetchRequest<Person>(entityName... 而不是 NSFetchRequest<NSFetchRequestResult>(entityName...,这避免了在获取行中进行类型转换。