核心数据 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...
,这避免了在获取行中进行类型转换。
我有一个 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...
,这避免了在获取行中进行类型转换。