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



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

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

[myView setNeedsDisplay: YES];

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

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

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

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

您可以使用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];
}

相关内容

  • 没有找到相关文章

最新更新