2

我正在开发一个 iOS 应用程序,我有一个 NSMutableArray 对象,对象是具有开始日期和结束日期的事件。开始日期是时间戳格式,结束日期不是。

我想根据用户输入的日期过滤该数组 (datePicker) 。

现在我有这个代码并且它部分工作,因为假设一个事件将从 3 月 30 日开始,到 4 月 2 日结束,如果用户输入 3 月 30 日之前的任何日期,那么该事件将出现在我的列表中(即好的)但是如果用户输入让我们说 3 月 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];


            }
        }
    }

我正在考虑将结束日期转换为时间戳并使用某种范围检查。

谢谢您的帮助。

4

2 回答 2

3

我不是 100% 清楚您希望过滤器过滤什么,但这里有一些建议:

  1. 使用OO设计。教你的事件表明它们是否匹配。
  2. 使用 NSDate 比较方法 earlyDate: 和 laterDate:

我会从您的问题中猜测您想要选择在用户选择的日期发生的事件:

// 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];
    }
}
于 2013-03-07T16:24:53.593 回答
1

如果您喜欢单线,这里有一个可以满足您的需求:

self.filteredListCaleventsList = [eventsList filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"dateDebutTimeStamp >= %@", datePickerInTimeStamp]];

请注意,它使用动态定义的谓词,而没有变量来保存它。如果您认为您的代码使用变量更具可读性,您可以只定义一个。

我还借此机会删除了属性名称开头的下划线,以符合标准命名约定。下划线用于表示支持该属性的 ivar(在正常情况下,有一个支持 ivar)。

于 2013-03-07T18:10:11.913 回答