![]() |
1
13
这里的问题是,即使在菜单跟踪模式下,也需要回调来触发。 例如,-[nstask waituntlexit]“使用nsdefaultrunloopmode轮询当前运行循环,直到任务完成”。这意味着在菜单关闭之前它不会运行。在这一点上,调度updatethemenu在nscommonrunloopmode上运行没有帮助,毕竟它不能及时返回。我相信nsnotificationCenter观察程序也只在nsdefaultrunloopmode中触发。 如果您可以找到某种方法来安排即使在菜单跟踪模式下也会运行的回调,那么您就可以设置;您可以直接从该回调调用updatethemenu。
运行这个并按住“文件”菜单,您将看到额外的菜单项每半秒钟出现一次并消失一次。很明显,“每半秒”不是你要找的,而且nstimer不理解“当我的后台任务完成时”。但是可能有一些同样简单的机制可以使用。 如果没有,您可以自己用nsport子类之一构建它,例如,创建一个nsmessageport,并在完成后让您的nstask写入它。 唯一的情况是,如果您试图从运行循环的外部调用它,那么您真的需要按照上面描述的rob keniger的方式显式地调度updatethemenu。例如,您可以生成一个引发子进程并调用waitpid(在进程完成之前一直阻塞)的线程,然后该线程将必须调用performselector:target:argument:order:modes:而不是直接调用updatethemenu。 |
![]() |
2
16
菜单鼠标跟踪在特殊的运行循环模式下完成。(
还可以将模式指定为
然后,更新方法将执行如下操作:
|
![]() |
3
14
(如果您想更改菜单的布局,类似于当您选择单击时机场菜单显示更多信息的方式,请继续阅读。如果你想做一些完全不同的事情,那么这个答案可能没有你想要的那么重要。)
关键是
现在,你会认为这会创建一个包含两个项目的菜单:“做点什么…”和“做点什么”,你会部分正确。因为我们将第二个菜单项设置为备用菜单项,并且由于两个菜单项具有相同的等效键(但修改器遮罩不同),所以只有第一个菜单项(即默认的
例如,这就是苹果菜单的工作原理。如果你点击一下它,你会看到一些后面有省略号的选项,比如“重启…”和“关机…”。hig指定如果存在省略号,则意味着系统将在执行操作之前提示用户确认。但是,如果按选项键(菜单仍处于打开状态),您会发现它们变为“重新启动”和“关机”。省略号消失,这意味着如果在按下选项键的同时选择它们,它们将立即执行,而不提示用户确认。 对于状态项中的菜单,相同的常规功能同样适用。您可以将展开的信息设为“备用”项,以显示常规信息,只需按下选项键即可。一旦你了解了基本原理,它实际上很容易实现,而不需要太多的技巧。 |
![]() |
Noah H · 如何通过终端或Swift禁用三指轻拍手势? 7 年前 |
![]() |
Dmitry Serov · 货币数字格式-数字为整数时省略分数部分 7 年前 |
![]() |
Duny · ObjC日期始终返回2017年12月25日 7 年前 |
![]() |
Jan Kaiser · NSButton不调用其操作 7 年前 |