这似乎应该很容易,但我必须缺少一些东西。我有一个基于文档的应用程序。我还构建了一个新的XIB,该XIB具有一个NstableView和三个按钮,我打算显示以前的文件列表。我希望在应用程序首次启动时显示此XIB而不是文档窗口。用户选择旧文件或键入“新”按钮后,我希望转到文档窗口。这很普遍,我见过经常使用。

为了实现此功能,我已经修改了project-info.plist文件,并将主笔尖文件基数从myDocument更改为选择XIB名称。这导致应用程序显示选择窗口而不是MyDocument窗口。到目前为止,似乎没有问题。

在我的选择窗口中,我设置了我的表视图和一个数组控制器和一个自定义窗口控制器,仅适用于此XIB。我已经将文件的所有者设置为新的窗口控制器,并将窗口控制器的窗口属性绑定到窗口和窗口的委托属性到文件所有者以及“选择”,“取消”和“新”按钮。没有任何束缚。但是奇怪的是,当我运行此应用程序时,似乎想将这些控制器连接到NSApplication使用错误(对于其他两个按钮相同):

无法连接动作SelectButton:到Nsapplication类的目标

它还显示出一个错误,即Nsapplication不符合我的数组引用的插座键值。数组控制器,窗口和按钮不与Nsapplication绑定,而是与新窗口控制器绑定。我本来可以预料,如果有任何问题,不会提及nsapplication,而是控制器所绑定的窗口控制器。

有人知道这里发生了什么吗?这是一个目标行动问题,因为我将“主nib文件库”从“主菜单”更改为“选择”?如果我不应该更改此内容,那么如何让可可允许我在显示文档窗口之前显示选择屏幕?

任何帮助是极大的赞赏。抢

有帮助吗?

解决方案

iB中文件所有者的级别的设置仅是建议;它使IB仅显示该类实例提供的插座和动作。它不会强制执行文件的所有者将是该类的实例,因为文件的所有者不是笔尖的一部分。

文件的所有者是加载笔尖的对象。 这必然意味着它不在笔尖,而笔尖中的任何内容都没有决定。 对于Mainmenu Nib,其文件的所有者(加载Mainmenu Nib的对象)是NSapplication实例。因此,即使您告诉IB这不是应用程序,您也将所有连接到文件的所有者都连接到了应用程序对象。

该应用程序是Mainmenu Nib的所有者(您告诉IB的内容)不是错误。该应用程序是 总是 Mainmenu Nib的所有者。这是正常和正确的;您不能更改它,不应尝试更改它,也不需要更改它。

简而言之,错误是您将一个笔尖用于两个截然不同的目的。

您应该让Mainmenu Nib单独使用 - 仅包含Mainmenu,您的自定义文档控制器(我将在稍后进行)和您的应用程序委托 - 并将以前的Documents窗口移至由由以前的Documents窗口控制器。为了让窗口控制器成为此笔尖的所有者,您需要将窗口控制器加载。您必须在代码中执行此操作 - 您无法在IB或PLIST中进行设置。

在您的应用程序的代表中,实例化并拥有窗口控制器。听起来您制作了一个自定义的nswindowController子类,因此您可以覆盖其 init 让它发送自己 initWithWindowNibName: 消息加载和拥有笔尖。然后,只使用 allocinit 从应用程序委托创建窗口控制器。

这将摆脱控制台消息,并确保按钮实际上已连接到窗口控制器(因为它们已连接到文件的所有者,随着此更改,将是窗口控制器)。

让您的应用程序代表回应 applicationOpenUntitledFile: 通过发送窗口控制器 showWindow: 信息。这将使用户通常会创建一个新文档的任何时候出现“上图”窗口。

如果您想支持创建文档的通常方法(即允许新文档起作用),请实现 applicationDidFinishLaunching:applicationShouldHandleReopen:hasVisibleWindows:, , 不是 applicationOpenUntitledFile:. 。确保没有打开文档,并在情况下显示您的窗口。

您还应该制作一个自定义的NSDocumentController子类,并使您的文档控制器成为一个实例,在该类中,实现 addDocument:removeDocument: 要重新展示上一个打开文档时,请重新显示上述窗口,并在打开文档时将其隐藏。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top