我正在调查Mac OS X 10.8上的一个问题,我已经无计可施了。我不知道下一步该做什么。
该应用程序是32位的,其中包含一些Carbon调用。
问题是:当我右键单击dock中的应用程序图标,选择菜单项“隐藏”,然后,在应用程序隐藏后,我从dock中选择“显示”菜单项,问题就出现了:主文档窗口不会出现(调色板和菜单会出现)。
此时,“显示”菜单项不会更改为“隐藏”,即使调色板已变为可见。
当我从应用程序停靠菜单中选择“显示”时,我希望主文档窗口变得可见。就像其他Mac应用程序一样。
当它失败时,如果我在触控板上使用App Expos手势来显示文档窗口并选择主文档窗口,我可以使主文档窗口再次可见。
如果我从终端或Xcode启动应用程序,效果会很好。此时将显示文档窗口,我的应用程序的停靠菜单项将按预期更改为“隐藏”。我通过导航到*.app的父目录并键入
./MyApp.app/Contents/MacOS/MyApp
.
当我双击Finder中的应用程序图标启动时,它会失败。
当从终端和Xcode启动应用程序时,应用程序代理的取消隐藏功能会显示我的日志消息,但从Finder启动时不会显示。
â applicationWillUnhide:
â applicationDidUnhide:
我已经在Console.app中查找了抛出的任何异常(或任何其他消息)。没有。
使现代化
:
为了尝试调试这一点,我从Finder启动,并使用Xcode连接到进程。
我曾怀疑有人抛出了异常,当我使用Xcode的“异常断点”测试它,并在objc_exception_show上设置断点(以防万一)时,当我隐藏或“显示”应用程序时,它不会中断。
然后我想我需要证明
NSApplicationWillUnhideNotification
和
NSApplicationDidUnhideNotification
正在发送。当我从Xcode或终端启动时,它们就是,但如果我从Finder启动,它们就不是。
在将Xcode附加到应用程序后,我通过“添加符号断点”设置断点来验证这一点:
-[NSNotificationCenter postNotificationName:object:userInfo]
然后,我添加了一个调试器命令:“po*(id*)($esp+12)”,以打印出该选择器的第一个参数(通知名称)。
我在一个
answer posted here,
在StackOverflow中。
使用它,我可以看到在我选择“显示”菜单项后发布的通知。当我从Xcode/Terminal启动时,我看到发布了以下通知:
NSApplicationWillUpdateNotification, NSWindowDidUpdateNotification, NSApplicationDidUpdateNotification, ** NSApplicationWillUnhideNotification **, ..., ** NSApplicationDidUnhideNotification **, ..., NSApplicationWillBecomeActiveNotification, ...
NSApplicationWillUn隐藏通知
在这种情况下发布。
当我从Finder启动时,我看到发布了以下通知:
NSApplicationWillUpdateNotification, NSWindowDidUpdateNotification, NSApplicationDidUpdateNotification, NSApplicationWillBecomeActiveNotification, ...
它不会发送
NSApplicationWillUn隐藏通知
此外,当我从Xcode启动的版本中选择“显示”时,我看到
-[NSApplication _doUnhideWithoutActivation]
在回溯中。当我连接到Finder启动的版本时,为该函数设置断点不会导致我选择“显示”时的中断。
然后,我心想,也许应用程序认为它没有被隐藏。
我有一个空闲的事件处理程序,所以我从那里打印出的值
[[NSApplication sharedApplicaton] isHidden]
而我隐藏并“显示”应用程序。
对于出现问题的情况,当应用程序未被隐藏时,它会打印出来
NO
对于
isHidden
。当应用程序被隐藏时,它会打印出来
YES
对于
is隐藏
。当我从停靠菜单中选择“显示”时,它会继续打印出来
不
对于
is隐藏
。它知道它是隐藏的,但部分应用程序已被激活:
NSPanels
以及
NSMenuBar
显得
我可以通过进入应用程序Expos模式来查看文档窗口,单击文档窗口将显示该窗口,但dock菜单项仍然是“Show”和
is隐藏
静止不动
对
.
取消隐藏机制对于一个示例应用程序来说很好,所以我很确定我们的代码正在做一些事情来关闭它。
我想知道从终端启动的应用程序与从Finder启动的应用软件有什么不同?
我让应用程序使用
[[NSProcessInfo processInfo] environment]
我能看到的唯一真正的区别是
压水堆
存在于终端应用程序的变量中:我在我们的代码中看不到任何使用它的东西。
我让应用程序通过
[[NSProcessInfo processInfo] arguments]
,我确实在Finder推出的版本中看到了一些不同的东西。终端和Finder启动的版本都将二进制文件的路径列为第一个参数;Finder还列出了第二个参数“-psn_0_89445704”。我在网上读到,它是Mac OS X添加到GUI应用程序的命令行参数中的东西,我看到它添加到其他应用程序的行参数中,这些应用程序可以从Dock菜单中正确隐藏和显示。
你还有其他想法可以引导我进一步解开这个谜团吗?感谢您的帮助或建议!