【问题标题】:OS X How do I update relative date display when date changes?OS X 如何在日期更改时更新相对日期显示?
【发布时间】:2013-02-23 00:29:18
【问题描述】:

我的应用程序使用默认系统存储上次数据更新的日期和时间。

我的窗口有一个绑定到该值的文本框。此文本框还附加了一个日期格式化程序。全部通过界面生成器完成。日期格式设置为使用相对日期。

数据仅在白天更新,每次有新数据到达时,文本字段都会完美更新。所以我得到类似的东西:

今天,09:30 今天,09:35 今天,09:40 … 今天,17:40

17:40 将是当天的最后一次数据更新。

问题是,一旦到了午夜,它仍然会显示 Today, 17:40,而应该显示 Yesterday, 17:40。

如果我退出并重新打开应用程序,它会显示昨天,17:40。

我想我需要告诉一些东西来刷新,但我不确定是什么而且我找不到示例。

1) 显然你可以发送假的 willChangeValueForKey 和 didChangeValueForKey 通知,但很多人说这是不正确的。

2) 我尝试在午夜后将用户默认值设置为自身,但这并没有触发更改。

3) 我尝试将用户默认值设置为 nil,然后在午夜后返回,但这也不起作用。

我确信有一个正确且简单的方法可以做到这一点,但我找不到它。

我需要触发什么? 我需要触发哪个对象?

非常感谢。

【问题讨论】:

    标签: objective-c macos nsdateformatter


    【解决方案1】:

    1) 显然你可以发送假 willChangeValueForKey 和 didChangeValueForKey 通知,但很多人说这不是 正确。

    我会说你可以使用这种方式。这种方式没什么不好。

    【讨论】:

      【解决方案2】:

      您需要使用计时器更新该显示...执行以下操作:

      (在你看来,可能是DidLoad)

      [NSTimer scheduledTimerWithTimeInterval:60.0 target:self selector:@selector(refreshDisplay) userInfo:nil repeats:YES];
      

      ...然后您只需构建一个刷新时间字段的新方法

      - (void)refreshDisplay {
          // do something to refresh your text label based on relative date
      }
      

      【讨论】:

      • 我的 NSTimer 运行良好 - 每天午夜触发(并更新一些其他内容)。我有一个类似的方法(midnightUpdates),就像你建议的那样。我仍然不确定要调用什么来进行实际刷新?
      • 您是否为您的文本框设置了插座?也许[yourTextbox setNeedsDisplay] 可以解决问题。
      • 我做了更多调查,午夜后值会自动更改,但不会自动调用 NSTextField 上的显示。它仅在下次发生重新显示时更新 - 例如激活窗口。所以你是对的@James Boucher - 如果你希望更改立即反映在 UI 中,那么你必须做 [yourTextBox display]。 NSTextField 需要做点什么——不需要发送 KVO 更新或更改 NSDateFormatter。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      相关资源
      最近更新 更多