0

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

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

[myView setNeedsDisplay: YES];

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

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

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

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

4

1 回答 1

2

您可以NSTimer为此使用一个。但是,首先,您需要弄清楚何时NSTimer应该触发。您可以使用NSDate,NSCalendarNSDateComponents为此:

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 回答