我正在开发一个iOS应用程序,我有一个NSMutableArray对象,对象是具有开始日期和结束日期的事件。 开始日期采用时间戳格式,结束日期不是。
我想根据用户输入的日期(datePicker)过滤该数组。
现在我有了这段代码并且部分正常工作,因为假设一个事件将从3月30日开始到4月2日结束,如果用户输入3月30日之前的任何日期,该事件将出现在我的列表中(这没关系)但是如果用户输入,请说三月31日不会过滤相同的事件而这是错误的,因为事件要发生。
if(datePickerInTimeStamp>0)
{
//I know I might use while instead of an if
for (EventObj *_eventObj in eventsList)
{
if(_eventObj.dateDebutTimeStamp>0){
if ( datePickerInTimeStamp <= _eventObj.dateDebutTimeStamp)
[self._filteredListCaleventsList addObject:_eventObj];
}
}
}
我正在考虑将结束日期转换为时间戳并使用某种范围检查。
感谢您的帮助。
答案 0 :(得分:3)
我不是100%明确你希望过滤器过滤的内容,但这里有一些建议:
我会从您的问题中猜测您想要选择在用户选择日期时发生的事件:
// in your class EventObj.m
// answer true if date is between the event start and end
- (BOOL)isOccurringOn:(NSDate *)date {
return [self.start == [self.start earlierDate:date]] &&
[self.end == [self.end laterDate:date]];
}
如果你想过滤一些对事件来说很自然的方式,比如之前的开始,之前的开始,之前的结束等等,这里有BOOL应答方法。
现在你的EventObj做了一些有意义且易于阅读的东西,你的循环也更漂亮:
// get NSDate *selectedDate from user
// using your var names, though the _underscores are strange ...
for (EventObj *_eventObj in eventsList) {
if ([_eventObj isOccurringOn:selectedDate]) {
[self._filteredListCaleventsList addObject:_eventObj];
}
}
答案 1 :(得分:1)
如果你是一个人,那么这就是你所做的事情:
self.filteredListCaleventsList = [eventsList filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"dateDebutTimeStamp >= %@", datePickerInTimeStamp]];
请注意,它使用动态定义的谓词而没有变量来保存它。如果您认为代码对变量更具可读性,则可以定义一个。
我还借此机会删除了属性名称开头的下划线,符合标准命名约定。下划线用于表示支持属性的ivar(在正常情况下,有背面ivar)。