核心数据nstableview搜索栏

时间:2017-06-08 07:51:29

标签: macos cocoa swift3 nstableview

我有一个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
}

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

但我不知道我怎么能意识到这一点。

1 个答案:

答案 0 :(得分:0)

  • NSSearchField的委托设置为目标类
  • 实施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子类,则创建更具体的NSFetchRequest<Person>(entityName...而不是NSFetchRequest<NSFetchRequestResult>(entityName...的获取请求,这样可以避免在获取行中输入类型。