在日期更改时触发重新显示

时间:2012-07-06 17:20:19

标签: objective-c date graphics drawrect setneedsdisplay

这可能是一个简单的问题,但我是一个新手,所以我画了一个空白。

我有一个2D图形应用程序,其图形(在drawRect中实现)取决于日期。当日期改变时,图形会发生变化,所以我想我需要调用

[myView setNeedsDisplay: YES];

日期变更时。我见过定时器的代码,但这似乎不是定时器类型的场景。我如何检查本地日期是否已更改,以及我将该代码放入哪个类?我假设它会在我的主视图的.m文件中。

除了在更改日期时自动触发,最终,应用程序将需要触发用户输入(可能是一天前进或后退按钮或选择日期选择器)。

图形渲染效果不错,但我没有编写任何日期触发器,因此虽然drawRect代码是特定于日期的,但是当日期更改时它不会改变。

P.S。我上面的基本问题已经得到解答,但现在我去实施它,我意识到我还有另一个问题。我应该在某个地方有一个属性来跟踪当前正在显示其配置的日期。显而易见的想法是在包含NSDate对象的主视图中添加属性。但是我编码的方式,计算是通过子视图类中的方法完成的。所以问题是,如何从子视图更新主视图的NSDate属性。另一种方法是将NSDate属性添加到子视图,但是有多个这样的子视图,这似乎是多余的。对此有何意见?

1 个答案:

答案 0 :(得分:2)

您可以使用NSTimer。首先,您需要弄清楚NSTimer何时应该触发。您可以使用NSDateNSCalendarNSDateComponents

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];
}
相关问题