我有一个NSTableview,它获取核心数据的日期。
在我的实体中是Date
类型的属性。
现在我想实现一个搜索功能。 为此,我有这个代码:
@IBAction func search(_ sender: NSSearchField) {
let predicate : NSPredicate?
if sender.stringValue.isEmpty {
predicate = nil
} else {
predicate = // ?
}
requestData(predicate: predicate)
}
但如果我使用属性Date
例如:
等等
我希望你理解我的问题,你可以帮助我:)。
答案 0 :(得分:0)
如果您使用日期类型作为日期,则可以将日期分为DateComponents:
let date = Date()
let calendar = Calendar(identifier: .gregorian)
let components = calendar.dateComponents([.year, .month, .day], from: date)
print(components.day, components.month, components.year)
然后您可以简单地比较和过滤这些组件。
答案 1 :(得分:0)
我认为您尝试使用NSSearchField
搜索日期会遇到一些问题,因为将用户输入的内容转换为可行的Date
对象将涉及一大块逻辑一个简单的例子就是来自美国的用户输入2017年2月2日的2017年2月2日与2017年8月2日的欧洲公民打字。
还有一个问题是用户绑定的内容如上周四"进入搜索字段并将其转换为Date
对象。
我的建议是实现一些排序UI控件,例如日期选择器,可以轻松地将用户输入转换为可用的Date
对象。
除此之外,您可以通过执行以下操作来构造使用日期对象的谓词:
let now: Date = Date()
let predicate: NSPredicate = NSPredicate(format: "date < %@", now as NSDate)
我希望有所帮助。
答案 2 :(得分:0)
如前所述,这是一个棘手的案例。但我相信它可以做到。 正如Alex建议的那样,您可以使用DateComponents来比较和查找所需的日期。但要执行此操作,您应该在CoreData表的数据模型类中定义其他变量。例如:
var calendar = Calendar(identifier: .gregorian)
var openDateComponents: DateComponents {
return calendar.dateComponents([.year, .month, .day], from: openTime! as Date)
}
不幸的是,你不能将它用作谓词。但是这个定义的变量将允许您在从表中获取数据后使用它。您可以使用循环轻松实现过滤。所以我建议你这样走:
在数据模型类中定义变量。这将允许您在获取数据后过滤掉提取的结果。
为谓词实现其他逻辑。这将允许您最小化从数据库表中提取的记录数。
例如: 输入字符串为06.2017(MM.YYYY)。您可以使用DateFormatter将其转换为类型为Date(NSDate)的两个变量,然后将这两个变量用作谓词:
request.predicate = NSPredicate(format: "someDate > %@ and somedate < %@", inputDateStart as NSDate, inputDateEnd)
因此,这只会帮助您减少将从表中提取的记录数。但是如果输入字符串类似于12.02.XXXX,这对你没用。