3

这是一个根据当前时间过滤具有开始时间和结束时间的数组的示例。这工作正常:

问题:但在这里我想知道 collectionArr 的索引位置,谓词选择值。

NSDate* currentDate = [NSDate date];
NSDateFormatter *_formatter = [[[NSDateFormatter alloc] init] autorelease];
[_formatter setLocale:[NSLocale currentLocale]];
[_formatter setDateFormat:@"yyyy-MM-dd hh:mm a"];

NSString *_date=[_formatter stringFromDate:currentDate];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"StartDate <= %@ AND EndDate = %@", _date, _date];
if (shortPrograms.count > 0) {
    [shortPrograms removeAllObjects]; 
}

//collectionArr have multiple dictionaries ,which has start date and end date.  
//collectionArr = [[NSArray alloc] initWithObjects:[NSDictionary dictionaryWithObjectsAndKeys:@"..Sdate..",@"Startdate",@"..Edate..",@"Enddate", nil], nil]; 
//shortPrograms is a filter are, having the date in between start date and end date.

[shortPrograms addObjectsFromArray:[collectionArr filteredArrayUsingPredicate:predicate]];
4

3 回答 3

2

您的shortPrograms数组包含来自 的对象的子集collectionArr。听起来您想从中获取对象shortPrograms并确定collectionArr它的来源。

一般来说你不能。但是,如果其中的所有对象collectionArr都是唯一的,那么这是可能的。

id someObject = shortPrograms[someIndex]; // get some value
NSUInteger originalIndex = [collectionArr indexOfObject:someObject];

如果您的对象collectionArr不是唯一的,那么这将不起作用,因为无法知道您正在处理哪些重复项。

于 2013-03-27T19:46:50.883 回答
2

如果你想根据一些比较从数组中获取索引,你应该使用 indexOfObjectsPassingTest:,而不是谓词。您似乎想要查找结束时间与当前日期(包括时间)相同的对象的索引。仅当键 EndDate 的值是 NSDate 对象而不是字符串时,这才有效。此外,假设您的开始日期总是相同或更早于结束日期,没有理由检查开始时间,只检查结束时间。这就是您可以使用我上面提到的方法的方式:

NSIndexSet *indxs = [collectionArr indexesOfObjectsPassingTest:^BOOL(NSDictionary *dict, NSUInteger idx, BOOL *stop) {
        return (fabs([dict[@"EndDate"] timeIntervalSinceNow]) < 10);
    }];
NSLog(@"%@",indxs);

这将返回键 EndDate 的值与当前时间和日期相差不到 10 秒的任何字典的索引。

于 2013-03-27T20:05:22.670 回答
0

据我所知,这是不可能NSPredicate

没有可用的方法可以NSPredicate返回索引位置。

您可能必须实现自己的逻辑才能实现目标。

于 2013-03-27T19:24:41.373 回答