3

現在の時刻に従って開始時刻と終了時刻を持つ配列をフィルタリングする例を次に示します。これはうまくいきます:

QUESTION : しかし、ここで述語が値を選択する 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

何らかの比較に基づいて配列からインデックスを取得する場合は、述語ではなく、indexsOfObjectsPassingTest: を使用する必要があります。終了時刻が現在の日付 (時刻を含む) と同じであるオブジェクトのインデックスを検索したいようです。これは、キー 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 に答える
2

配列shortProgramsには、 のオブジェクトのサブセットが含まれていますcollectionArrshortProgramsオブジェクトを取得して、それがどこから来たのかを特定したいようですcollectionArr

一般的にはできません。ただし、すべてのオブジェクトcollectionArrが一意である場合は可能です。

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

のオブジェクトcollectionArrが一意でない場合、どの重複を扱っているかを知る方法がないため、これは機能しません。

于 2013-03-27T19:46:50.883 に答える
0

私の少しの知識から、それは不可能ですNSPredicate

NSPredicateインデックス位置を返すメソッドはありません。

目標を達成するには、独自のロジックを実装する必要がある場合があります。

于 2013-03-27T19:24:41.373 に答える