2

iOSアプリで作業していて、オブジェクトのNSMutableArrayがあります。オブジェクトは、開始日と終了日を持つイベントです。開始日はタイムスタンプ形式ですが、終了日はそうではありません。

ユーザーが入力する日付(datePicker)に応じて、その配列をフィルター処理したいと思います。

今のところ、このコードがあり、部分的に機能しています。イベントが3月30日に開始し、4月2日に終了するとします。ユーザーが、3月30日より前の日付を入力すると、そのイベントが私のリストに表示されます( ok)しかし、ユーザーが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 に答える