我正在将一些Cocoa功能包装在一个将从跨平台C库调用的Objective-C库中。我的目标之一是为在Linux上进行C开发的人提供部署到OSX的能力,而无需进入XCode,nib文件等。我希望他们能够在OSX上编译和链接他们的代码使用命令行工具,最后是一个常规可调整大小的主窗口,其中包含常用按钮等,应用程序菜单和停靠图标,其外观和行为符合预期,等等。
我正在研究OSX 10.8.5。我安装了XCode 5.0。这是我的gcc --version
输出:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.76) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix
我已经想出如何在不使用XCode或任何笔尖或plist的情况下,以编程方式呈现主窗口,如何设置应用程序菜单以及其他各种内容,但我遇到了Dock的问题图标。
我通过调用:
设置自定义停靠图标图像[NSApp setApplicationIconImage:dockImage];
当用户退出应用程序时,停靠图标图像会在离开之前简要地恢复为其他内容(某种默认应用程序图标或视图)。如何在不使用XCode创建笔尖或plist的情况下防止这种情况发生?
我已尝试将NSApp
的激活策略设置为禁止在应用委托的applicationShouldTerminate
方法中,尝试在此切换发生之前隐藏停靠图标。这没有帮助,它确实隐藏了窗口和停靠图标,但是停靠图标仍然会暂时切换回默认图标,作为隐藏过程的一部分。我通过返回NSTerminateLator
确认了这一点,并确认将激活策略设置为禁止会导致停靠和图标隐藏,即使应用程序没有终止,也不设置它会使其保持未被隐藏。
我尝试了对NSApplication
进行子类化并覆盖setApplicationIconImage
调用。我已经确认它是第二次被调用,除了我的代码之外的其他东西(好吧,或者不是直接通过我的代码),就在程序退出之前。我已经尝试通过第一次调用超级函数来阻止第二次调用它,但不是第二次,我已经确认该函数中的代码可以阻止我的代码更改应用程序图标,但是没有解决问题。无论如何,它仍然会发生。
我也尝试删除应用程序徽章,如下所示:
[[window dockTile] setShowsApplicationBadge: NO];
以防万一与此有关,但这不起作用。文档说,从10.6开始,app徽章已经不再适用了,但我抓住了稻草。
在编程方面遇到困难,我现在正试图找出如何从头开始打包.app而不使用XCode,看看我是否可以从头开始创建一个引用应用程序映像的plist它。但是程序化解决方案更可取,因为我真的想最大限度地减少部署的OSX特定包装中的内容。
另一种可能性是使用XCode一次,以生成我的部署脚本复制和更改的非常通用的,简单的.app。
请不要把我的问题写成“太宽泛”或“没有建设性”或类似的东西。我意识到我正在重新发明已经以各种形式存在的轮子,但没有法律反对试图建立一个更好的鼠标陷阱,或者只是一个不同的甚至更糟的一个。我意识到我正在尝试解决许多人认为无关紧要的问题,但XCode制作的应用程序没有这个问题,我真的不希望我创建的工具产生任何用户可见的这样的文物。我不打算解散Apple的工具链,也不打算讨论是否应该追求我追求的目标。我有一个特定的技术问题,我正在寻找解决方案,这是在我的目标的约束。