这可能是一个简单的问题,但我是新手,所以我画了一个空白。
我有一个 2D 图形应用程序,其图形(在 drawRect 中实现)取决于日期。当日期更改时,图形也会更改,所以我想我需要调用
[myView setNeedsDisplay: YES];
当日期更改时。我看过计时器的代码,但这似乎不是计时器类型的场景。我将如何检查本地日期是否已更改,以及我将把该代码放入哪个类?我假设它会进入我的主视图的 .m 文件中。
除了在日期更改时自动触发之外,最终,应用还需要在用户输入时触发(可能是一天前进或后退的按钮,或者在选择日期选择器时)。
图形按原样呈现得很好,但我没有编写任何日期触发器,因此虽然 drawRect 代码是特定于日期的,但当日期更改时它不会更改。
附言我上面的基本问题已经得到了回答,但是现在我去实施它,我意识到我还有另一个问题。我应该在某处有一个属性来跟踪当前显示其配置的日期。显而易见的想法是向包含 NSDate 对象的主视图添加一个属性。但是我编码的方式是,计算是通过子视图类中的方法完成的。所以问题是,如何从子视图更新主视图的 NSDate 属性。另一种方法是将 NSDate 属性添加到子视图,但有多个这样的子视图,这似乎是多余的。对此有什么意见吗?
您可以使用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];
}