1

基于文档的 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.
4

2 回答 2

4

Document-based apps don't have a "main" window -- by definition, a document-based app is based on a UI involving one window for each document. If, when creating a new app project in Xcode, you want an app whose UI centers on a single window (like iTunes or System Preferences), uncheck "Create Document-Based Application" after choosing the Application template.

If you want to create an app that uses the document-based workflow but also has non-document-specific windows, you can create separate nibs for those windows and implement logic to show and control them someplace outside of your document class. (For example, you could create an NSWindowController subclass for a preferences window, with accompanying nib for that window's user interface, and instantiate/show that window from a menu command implemented in your application delegate.)

于 2013-09-23T17:40:16.153 回答
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;

于 2013-09-24T05:04:35.443 回答