Xcode 5 中基于文档的 Mac 应用程序
Posted
技术标签:
【中文标题】Xcode 5 中基于文档的 Mac 应用程序【英文标题】:Document based Mac application in Xcode 5 【发布时间】:2013-09-23 17:08:05 【问题描述】:基于文档的 Mac 应用程序的主窗口在哪里?如果您从 Xcode 创建一个新项目,则 MainMenu.xib 中没有窗口。 Document.xib 中只有一个 window 对象用于文档的窗口。我想在界面生成器中设计主窗口,但我不明白它是在哪里创建的。
编辑
我想我在 Xcode 中遇到了一个错误。使用随机名称创建基于文档的应用程序按预期工作。
但是,如果我使用以前的项目名称创建一个基于文档的应用程序,我会首先看到一个非文档窗口,并且控制台中还会出现此错误。
Unknown class 'AppDelegate', using 'NSObject' instead. Encountered in Interface Builder file at path /Users/[COMPUTER]/Library/Developer/Xcode/DerivedData/[PROJECT]-gohsjlddlopenfapdikaqibmvvqs/Build/Products/Debug/[PROJECT]/Contents/Resources/en.lproj/MainMenu.nib.
【问题讨论】:
【参考方案1】:基于文档的应用程序没有“主”窗口——根据定义,基于文档的应用程序基于一个用户界面,每个文档都有一个窗口。如果在 Xcode 中创建新的应用程序项目时,您想要一个 UI 以单个窗口为中心的应用程序(如 iTunes 或系统偏好设置),请在选择应用程序模板后取消选中“创建基于文档的应用程序”。
如果您想创建一个使用基于文档的工作流但也具有非文档特定窗口的应用程序,您可以为这些窗口创建单独的 nib 并实现逻辑以在文档类之外的某个位置显示和控制它们。 (例如,您可以为首选项窗口创建一个NSWindowController
子类,并为该窗口的用户界面附带一个 nib,并通过在您的应用程序委托中实现的菜单命令实例化/显示该窗口。)
【讨论】:
当我运行我的项目时,它首先显示一个空的纹理窗口而不是文档窗口。当我执行 File -> New 时,会显示一个文档窗口。我不明白第一个窗口是干什么用的。【参考方案2】:基本的 cocoa 文档架构假设应用程序的每个文档都有一个窗口,并且主菜单 nib 由应用程序委托拥有。
它不会阻止您对任何 nib 或控制器进行子类化或添加其他窗口。
如果您想要的是主窗口和文档窗口,那是一种常见的范例,但在提供的模板中没有。
最简单的方法是在主菜单笔尖添加一个窗口。然后您可能希望它有一种方法来引用您的所有文档窗口。 Mac 上的邮件就是一个很好的例子,尽管它也允许多个主窗口。
您可能需要一个自定义的 NSWindowController 子类来正确执行此操作。
但您也可以添加一个 NSObject 子类作为您的应用程序委托,并在非基于文档的应用程序项目模板中模拟委托的配置。
您需要通过几个步骤来执行此操作。
创建一个 NSObject 子类。
确保它声明了协议。
在您的 MainMenu.xib 中,从库中添加一个 NSObject(看起来是蓝框的东西)。
将其类设置为新的 NSObject 子类。
单击 xib 文件中的 NSApplication 占位符图标,然后在右侧的检查器中,将委托属性连接到您的应用程序委托对象。
现在选择您的应用委托对象。
将其窗口属性连接到您在 xib 中的窗口。
如果没有,而且很可能没有,那么您需要在您的应用委托类接口中声明它。 (这与为任何按钮或其他对象添加属性相同,但您需要将其更改为
@property (unsafe_unretained) IBOutlet NSWindow *window;
到
@property (strong) IBOutlet NSWindow *window;
【讨论】:
以上是关于Xcode 5 中基于文档的 Mac 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 5 文档模板 Apps OS X:App 生命周期在哪里
Mac App Store Xcode 5 删除 Xcode 4
XCode:iPhone 目标依赖于 Mac OS X 目标