我已从NSMutableArray中的核心数据加载项目。创建每个项目时,将给出用户选择的截止日期。
如何排序,只显示今天到期的项目?
这是我到目前为止所得到的:
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"dueDate == %@", [NSDate date]];
[allObjectsArray filterUsingPredicate: predicate];
但是,此代码不起作用。
感谢您的任何建议
答案 0 :(得分:12)
你今天在00:00然后明天在00:00计算,然后将谓词中的日期与那些(> =和<)进行比较。因此,所有日期对象必须在这两个日期内被归类为“今天”。这要求您最初只计算2个日期,无论您的数组中有多少个日期对象。
// Setup
NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *now = [NSDate date];
// Get todays year month and day, ignoring the time
NSDateComponents *comp = [cal components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:now];
// Components to add 1 day
NSDateComponents *oneDay = [[NSDateComponents alloc] init];
oneDay.day = 1;
// From date & To date
NSDate *fromDate = [cal dateFromComponents:comp]; // Today at midnight
NSDate *toDate = [cal dateByAddingComponents:oneDay toDate:fromDate options:0]; // Tomorrow at midnight
// Cleanup
[oneDay release]
// Filter Mutable Array to Today
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"dueDate >= %@ && dueDate < %@", fromDate, toDate];
NSArray *filteredArray = [allObjectsArray filteredArrayUsingPredicate:predicate];
// Job Done!
答案 1 :(得分:1)
使用谓词的问题在于,如果他们使用标准日期比较,它将只返回与给定日期的日期和时间完全相同的日期。如果你想要“今天”日期,你需要在某处添加一个-isToday方法(可能作为NSDate的扩展),如下所示:
-(BOOL)dateIsToday:(NSDate *)aDate {
NSDate *now = [NSDate date];
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *nowComponents = [cal components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit
fromDate:now];
NSDateComponents *dateComponents = [cal components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit
fromDate:aDate];
return (([nowComponents day] == [dateComponents day]) &&
([nowComponents month] == [dateComponents month]) &&
([nowComponents year] == [dateComponents year]));
}
一旦你拥有了它,就很容易找到今天的那些:
NSMutableArray *itemsDueToday = [NSMutableArray array];
for (MyItem *item in items) {
if ([self dateIsToday:[item date]) {
[itemsDueToday addObject:item];
}
}
// Done!
答案 2 :(得分:0)
方法-filterUsingPredicate:
仅适用于可变数组(类型为NSMutableArray
)。
请尝试使用-filteredArrayUsingPredicate:
方法:
NSString *formattedPredicateString = [NSString stringWithFormat:@"dueDate == '%@'", [NSDate date]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:formattedPredicateString];
NSArray *filteredArray = [allObjectsArray filteredArrayUsingPredicate:predicate];