0

これはおそらく簡単な質問ですが、私は初心者なので、空白を描いています。

グラフィック(drawRectで実装)が日付に依存する2Dグラフィカルアプリケーションがあります。日付が変わるとグラフィックも変わるので、電話する必要があると思います

[myView setNeedsDisplay: YES];

日付が変わるとき。タイマーのコードを見たことがありますが、これはタイマータイプのシナリオではないようです。ローカル日付が変更されたかどうかを確認するにはどうすればよいですか?また、そのコードをどのクラスに配置しますか?メインビューの.mファイルに含まれると思います。

日付の変更時に自動的にトリガーされることに加えて、最終的には、アプリはユーザー入力(おそらく、ある日、または日付ピッカーの選択時に前後に移動するボタン)でトリガーする必要があります。

グラフィックはそのままで問題なくレンダリングされますが、日付トリガーはコーディングしていません。そのため、drawRectコードは日付固有ですが、日付が変更されても変更されません。

PS上記の私の基本的な質問は答えられましたが、それを実装しようとすると、別の問題があることに気付きます。構成が現在表示されている日付を追跡するためのプロパティがどこかにあるはずです。明らかなアイデアは、NSDateオブジェクトを保持するメインビューにプロパティを追加することです。しかし、私が物事をコーディングした方法では、計算はサブビュークラスのメソッドによって行われます。したがって、問題は、サブビューからメインビューのNSDateプロパティを更新する方法です。別の方法は、サブビューにNSDateプロパティを追加することですが、そのようなサブビューは複数あり、冗長であるように見えます。これについて何か意見はありますか?

4

1 に答える 1

2

これには を使用できますNSTimer。ただし、最初に、いつ起動するかを把握する必要がありますNSTimer。そのために、、、NSDateおよびNSCalendarを使用できます。NSDateComponents

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *todayComponents = [calendar components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];
NSDate *today = [calendar dateFromComponents:todayComponents];
// today is the start of today in the local time zone.  Note that `NSLog`
// will print it in UTC, so it will only print as midnight if your local
// time zone is UTC.

NSDateComponents *oneDay = [[NSDateComponents alloc] init];
oneDay.day = 1;
NSDate *tomorrow = [calendar dateByAddingComponents:oneDay toDate:today options:0];

を取得したらtomorrow、その日に起動するようにタイマーを設定できます。

NSTimer *timer = [[NSTimer alloc] initWithFireDate:tomorrow interval:0 target:self selector:@selector(tomorrowTimerDidFire:) userInfo:nil repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
// The run loop retains timer, so you don't need to.

そしてでtomorrowTimerDidFire:

- (void)tomorrowTimerDidFire:(NSTimer *)timer {
    [myView setNeedsDisplay:YES];
}
于 2012-07-06T20:22:07.587 に答える