【问题标题】:NSTimer with a menu bar app带有菜单栏应用的 NSTimer
【发布时间】:2010-02-13 23:22:50
【问题描述】:

我正在开发一个简单的计时器应用程序,我创建了一个带有菜单的 NSStatusItem,并且我有一些更新计时器标签的 NSTextField 标签 (http://cld.ly/e81dqm) 但是当我单击状态项时,NSTimer 停止(并停止更新标签).....我怎样才能解决这个问题?

编辑:这是启动计时器的代码:

timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerDidUpdate:) userInfo:nil repeats:YES];

【问题讨论】:

  • 需要查看启动和停止计时器的代码。你的意思是计时器会更新标签吗?
  • 当我点击状态项时它停止更新不知道是什么问题。

标签: objective-c cocoa nstimer


【解决方案1】:

您应该将计时器添加到 MainRunLoop 中,如下所示:

NSRunLoop * rl = [NSRunLoop mainRunLoop];
[rl addTimer:timer forMode:NSRunLoopCommonModes];

【讨论】:

  • 这看起来确实是首选答案。
  • 这似乎是迄今为止最简单的方法。此外,您可以在一行中使用[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
【解决方案2】:

我猜一旦您停止与 NSStatusItem 交互,计时器就会恢复? (在菜单的关闭和鼠标按钮释放后)。

用户交互将主运行循环置于不更新计时器的模式,因此如果您的标签必须不断更新,您可能需要将 NSTimer 和标签绘图移动到单独的进程或其他线程。

【讨论】:

  • 对不起,我对 obj-c/cocoa 有点陌生,我该如何移动到另一个线程等
  • 如果你以前没有做过线程,需要阅读一下:线程编程指南:tinyurl.com/yjnlegr 线程和图形上下文:tinyurl.com/yflqjjk 一个更简单的解决方案可能是设置一个为您的菜单委托,然后实现 menuWillOpen: & menuDidClose: 委托方法以在菜单打开时清除标签/视图(因此至少用户不会看到过期的标签)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多