【问题标题】:How to display the time whenever value of the current minute changes (with Cocoa)?如何在当前分钟的值发生变化时显示时间(使用 Cocoa)?
【发布时间】:2014-04-16 06:06:46
【问题描述】:

好吧,这真的让我很难过。挑战看起来很简单,但有一些限制真的让我大吃一惊。

节目要点:

(1) 当分钟改变时,应用程序应该以 HH:mm:ss 格式输出当前时间。

(2) 当秒数改变时,应用程序应该每秒输出一个字符,每十秒输出一个不同的字符(即“.........|.........| ”)。在这里需要注意的是,我不能只计算秒数。相反,程序必须知道当前时间秒的值,并且只有当它可以被 10 整除时才输出对应的字符。

限制:

(1) 程序可以有 2 个类 -- 一个用于分钟显示,一个用于秒显示。

(2) 每个类只能包含一个以定时器为参数的void方法。

(3) main函数会为每个类创建一个对象和2个NSTimers。 第一个计时器的时间间隔必须设置为 0.5,并且必须以分钟对象为目标。第二个计时器必须将其间隔设置为 0.1,并且必须以秒对象为目标。

我很想将第一个计时器设置为每分钟触发一次,将第二个计时器设置为每秒钟触发一次,但我不允许篡改它。这是我在被难住之前所得到的:

ma​​in.m:

MinuteDisplay *minutes = [[MinuteDisplay alloc] init];

__unused NSTimer *minutesTimer = 
    [NSTimer scheduledTimerWithTimeInterval:0.5
    target:minutes
    selector:@selector(minuteChange:)
    userInfo:nil
    repeats:YES];

[[NSRunLoop currentRunLoop] run];

MinuteDisplay.m:

- (void)minuteChange:(NSTimer *)timer
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"HH:mm:ss"];

    NSDateFormatter *testFormatter = [[NSDateFormatter alloc] init];
    [testFormatter setDateFormat:@"ss"];

    NSDate *now = [NSDate date];
    NSString *nowString = [dateFormatter stringFromDate:now];
    NSString *testString = [testFormatter stringFromDate:now];

    if ([testString isEqual:@"00"]) {
        NSLog(@"%@", nowString];
    }
}

示例输出:

01:09:00
//.5 second interval
01:09:00

我什至还没有理会这个挑战的后半部分,因为我在这里被难住了。这在技术上有效,但我知道我做错了,因为输出不依赖于知道分钟值已更改的程序。此外,由于计时器设置为每 0.5 秒触发一次,我每分钟得到两行输出,而不是只有一行(这不符合规范)。

谁能建议从这里去哪里?这个真的让我大吃一惊。

【问题讨论】:

    标签: objective-c cocoa nsdate nstimer


    【解决方案1】:

    如果您无法修改计时器间隔,另一种选择是在 MinuteDisplay 类中使​​用实例变量,例如 displayString。并修改minuteChange方法如下:

    - (void)minuteChange:(NSTimer *)timer
    {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"HH:mm:ss"];
    
        NSDateFormatter *testFormatter = [[NSDateFormatter alloc] init];
        [testFormatter setDateFormat:@"ss"];
    
        NSDate *now = [NSDate date];
        NSString *nowString = [dateFormatter stringFromDate:now];
        NSString *testString = [testFormatter stringFromDate:now];
        if ([testString isEqual:@"00"]) {
                    if(![nowString isEqualToString:dispString]) {
                dispString = nowString;
                NSLog(@"*************** %@", dispString);
            }
        }
    }
    

    这将确保每分钟只记录一次

    【讨论】:

      【解决方案2】:

      工作分钟更改方法:

      - (void)minuteChange:(NSTimer *)timer
      {
      NSDate *now = [NSDate date];
      if (!self.lastTime) {
          self.lastTime = [NSDate date];
      }
      
      if (now > self.lastTime) {
          if ([[self.seconds stringFromDate:now] isEqualToString:@"00"]) {
              printf("\n%s", [[self.output stringFromDate:now] UTF8String]);
              self.lastTime = now;
          }
      
      }
      
      self.output = [[NSDateFormatter alloc] init];
      [self.output setDateFormat:@"HH:mm:ss"];
      
      self.seconds = [[NSDateFormatter alloc] init];
      [self.seconds setDateFormat:@"ss"];
      
      }
      

      工作秒变方法:

      - (void)secondChange:(NSTimer *)timer
      {
      long secondsSince1970 = time(NULL);
      
      if (!self.lastSecond) {
          self.lastSecond = secondsSince1970;
      }
      
      if (secondsSince1970 > self.lastSecond) {
          if (secondsSince1970 % 10 == 0) {
              printf("|");
              self.lastSecond = secondsSince1970;
          } else {
              printf(".");
              self.lastSecond = secondsSince1970;
          }
      }
      
      }
      

      对 minuteChange 的更改: 最重要的变化是在类中添加了 lastTime ivar。现在很简单...如果 lastTime 为空,则为其分配当前日期的值。如果当前时间大于上一次,则测试是否是新的分钟,如果是则输出时间。仅在输出新分钟时更新 lastTime(这可确保每分钟仅显示一次时间)。

      秒变化: 对此采取了不同的方法,现在我希望我第一次使用直接 C。这个太简单了!检查当前秒是否大于上一秒。如果是,检查它是否能被 10 整除。如果是,打印“|”。如果没有,打印“.”。超级简单,实际上比将计时器设置为每秒触发一次更准确。嘘。

      【讨论】:

        猜你喜欢
        • 2019-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-15
        • 1970-01-01
        • 1970-01-01
        • 2021-03-14
        • 1970-01-01
        相关资源
        最近更新 更多