コード内にあるループの代わりに、述語を使用して、現在のすべてのオブジェクトをフィルターで除外することができます。今日の日付を除外するには、それを今日の初めと今日の終わりと比較します。
このように、任意のNSDateをその日付の先頭に設定できます(この回答を参照)
NSDate *beginDate = [NSDate date];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&beginDate interval:NULL forDate:beginDate];
次に、終了日を取得するには、それに1日を追加するだけです。秒数を計算して日数を加算しないでください。これは夏時間では機能しません!このようにしてください(この回答も参照してください):
NSDateComponents *oneDay = [[NSDateComponents alloc] init];
[oneDay setDay:1];
// one day after begin date
NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:oneDay toDate:beginDate options:0];
今日の範囲を定義する2つの日付ができたので、NSPredicateを使用してすべてのDayViewをフィルタリングし、次のように、今日のすべてのDayViewの新しい配列を取得できます(この回答を参照)。
// filter DayViews to only include those where the day is today
NSArray *daysThatAreToday = [_days filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", beginDate, endDate]];
これで、新しい配列(今日のDayViewを含む)を列挙することにより、すべてのDayViewに色合いの色を適用できます。
[daysThatAreToday enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// Set the tint color here...
}];
私の意見では、これはクリーンですが、より重要なことに、問題を解決する正しい方法です。それは明確に読み、夏時間と他のカレンダー、そしてグレゴリオ暦を処理します。また、特定の週(または他の期間)のすべてのDayViewに色を付けたい場合は、簡単に再利用できます。