【发布时间】:2013-02-28 03:44:59
【问题描述】:
我正在构建一个 Mac 应用程序,它只位于菜单栏中,没有停靠项,没有键窗口,也没有主菜单(info.plist 中的 LSUIElement 设置为 YES)。当我第一次启动应用程序时,applicationDidBecomeActive: 被调用,正如我所料。但是,一旦另一个应用程序获得焦点,applicationDidBecomeActive: 就再也不会被调用。
这可以防止我的应用程序中的文本字段成为第一响应者。当我第一次打开应用程序时,文本字段是可编辑的:
但是在另一个应用程序来到前台后,文本字段不可编辑:
我尝试过的:
当菜单打开时,menuWillOpen: 被 NSMenu 的委托调用。我试过放置以下内容但没有成功:
[NSApp unhide];
[NSApp arrangeInFront:self];
[NSApp activateIgnoringOtherApps:YES];
[NSApp requestUserAttention:NSCriticalRequest];
[[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps];
[[NSRunningApplication currentApplication] unhide];
我认为这个问题可能与没有任何窗户可以放在前面有关。我觉得我在这里抓住了稻草。任何帮助将不胜感激。
【问题讨论】:
-
如果应用程序从未重新启动,为什么还要再次调用它。如果它在菜单栏中,它的进程不是作为一种准守护进程存在吗?
-
也许它没有任何关系,但我最近遇到了一个问题,iOS 没有在恢复事件之后将视图作为第一响应者(当它是恢复之前的第一响应者时)。解决方法是在发送 becomeFirstResponder 消息之前 resignFirstResponder。不知道为什么,但它得到了 iOS 的支持。也许这里有类似的东西在起作用?
-
嘿,Ash,问题可能与 NSMenu 有关。将它用于文本输入从来都不是一个好主意。您是否尝试过使用 NSWindow 的相同步骤?
标签: objective-c macos menubar appkit