我有一个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
}
现在我想实现一个搜索栏(我已经在我的视图控制器中)用于搜索第一个或第二个名称。
但我不知道我怎么能意识到这一点。
答案 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...
的获取请求,这样可以避免在获取行中输入类型。