Rob*_*Rob 7 cocoa xib document-based cocoa-bindings
这似乎应该很容易但我必须遗漏一些东西.我有一个基于文档的应用程序.我还构建了一个新的XIB,它有一个NSTableView和三个按钮,我打算显示以前的文件列表.我希望在应用程序首次启动时显示此XIB而不是文档窗口.一旦用户选择旧文件或点击"新建"按钮,我希望然后转到文档窗口.这是非常常见的,我经常看到使用过.
在我试图实现这一点的过程中,我修改了project-info.plist文件,并将主要NIB文件基本名称从MyDocument更改为我的选择XIB名称.这会导致应用程序显示"选择"窗口而不是"MyDocument"窗口.到目前为止似乎没有问题.
在我的选择窗口中,我已经为此XIB设置了我的表视图和一个数组控制器以及一个自定义窗口控制器.我已将文件所有者设置为新的窗口控制器,并将窗口控制器的窗口属性绑定到窗口,将Window的委托属性绑定到文件所有者以及"选择","取消"和"新建"按钮.NSApplication没有任何限制.但奇怪的是,当我运行这个应用程序时,似乎想要将这些控制器连接到NSApplication并出现错误(对于其他两个按钮也是如此):
无法将动作selectButton:连接到类NSApplication的目标
它还显示一个错误,即NSApplication不符合Key-Value标准,用于保存对我的数组的引用的插座.阵列控制器,窗口和按钮不绑定到NSApplication,而是绑定到新的Window Controller.我原本以为如果有任何问题就不会提到NSApplication而是提到控制器绑定的窗口控制器.
谁知道这里发生了什么?这是一个Target-Action问题,因为我将"主要NIB文件库名称"从"主菜单"更改为"选择"?如果我不应该改变这个,那么我怎样才能让Cocoa允许我在显示文档窗口之前显示选择屏幕?
任何帮助是极大的赞赏.抢
IB中文件所有者的类的设置只是建议性的; 它允许IB仅显示该类实例提供的出口和操作.它不强制File的所有者将是该类的实例,因为File的Owner不是nib的一部分.
文件所有者是加载笔尖的对象.这必然意味着它在笔尖之外,并且笔尖中的任何东西都不能确定它.对于MainMenu nib,其文件所有者(加载MainMenu nib的对象)是NSApplication实例.因此,您连接到MainMenu笔尖中的文件所有者的所有内容,即使您告诉IB它不是应用程序,您也可以连接到应用程序对象.
应用程序是MainMenu笔尖的所有者 - 无论你告诉IB什么 - 不是bug.该应用程序始终是MainMenu笔尖的所有者.这是正常和正确的; 你无法改变它,不应该试图改变它,也不需要改变它.
简而言之,这个错误就是你使用一个笔尖用于两个非常不同的目的.
你应该让MainMenu nib独自一人 - 只包含MainMenu,你的自定义文档控制器(我稍后会介绍),你的应用委托 - 并将之前的文档窗口移动到一个单独的nib,由previous-documents窗口控制器.为了让窗口控制器成为此笔尖的所有者,您需要让窗口控制器加载它.你必须在代码中这样做 - 你不能在IB或plist中设置它.
在应用程序的委托中,实例化并拥有窗口控制器.听起来你做了一个自定义的NSWindowController子类,所以你可以覆盖它init,让它自己发送initWithWindowNibName:消息来加载和拥有nib.然后,只需使用alloc和init从app委托创建窗口控制器.
这将消除控制台消息,并确保按钮实际上连接到窗口控制器(因为它们连接到文件的所有者,通过此更改,它将是窗口控制器).
让您的应用程序委托applicationOpenUntitledFile:通过向窗口控制器发送showWindow:消息来响应.这将使用户通常在创建新文档时出现先前文档窗口.
如果你想支持创建文档的常用方法(即允许新建文档工作),然后实现applicationDidFinishLaunching:和applicationShouldHandleReopen:hasVisibleWindows:,不applicationOpenUntitledFile:.确保没有打开任何文档,如果是这种情况则显示您的窗口.
您还应该创建一个NSDocumentController的自定义子类,并使您的文档控制器成为该实例,并在该类中,实现addDocument:并removeDocument:在上一个打开的文档关闭时重新显示上一个文档窗口,并在文档时隐藏它打开.
| 归档时间: |
|
| 查看次数: |
2149 次 |
| 最近记录: |