如何为面向浏览器的应用程序创建NSDocument(子类)实例?

时间:2014-07-23 22:08:13

标签: macos cocoa nsdocument

我正在尝试使用带有(计划的)WebKit控件的面向NSDocument的应用程序(在OS X Mavericks上)。我注意到,如果所有文档类型都是Viewer或Other,则禁用“New”菜单命令。我正在制作一个网络浏览器,所以应用程序不应该是任何东西的编辑器,但这就是我需要启用新命令。

我想我需要覆盖一些东西,但在哪里?显而易见的候选者是NSDocument子类,NSDocumentController子类或应用程序委托。第一个是我到目前为止实际拥有的唯一一个(即由Xcode的默认代码包含),但NSDocument实例创建新代码似乎不合适。所以我必须创建一个NSDocumentController或NSApplicationDelgate子类才能做到这一点,对吗?

1 个答案:

答案 0 :(得分:0)

很多新手,我没有完全RTFM。

新文档命令由NSDocumentController处理。该类有一个defaultType方法,用于确定新文档应该是哪种类型。默认情况下,它会选择设置为“编辑器”模式的(静态)文档类型列表中的第一个类型。否则返回nil(即查看器和实用程序应用程序)。

非编辑应用可以通过创建NSDocumentController的子类来获取新文档,该子类至少会覆盖defaultType以返回描述新文档的文档类型的非nil字符串。我使用了MIME类型,但我猜UTI(也许扩展名)也可以使用。

但是有一个新问题:默认情况下不会创建NSDocumentController;默认的应用程序设置忽略该类并始终生成NSDocumentController对象。据说有两种方法:将子类的一个对象放入应用程序的第一个NIB,一个带有主菜单栏;或者在应用程序委托的一个初始化方法中将document-controller属性直接设置为子类的新对象。 (由于默认的基于文档的项目模板不包含应用程序委托类,因此您也必须创建它。)

但我听说两种方法都不确定;如果应用程序启动的任何前一部分触及NSDocument系统,将创建一个默认文档控制器并阻止您的对象。是否有任何Cocoa专家知道在哪里放置一个自定义NSDocumentController子类对象,以便它不会被默认的文档控制器抢占?

...

我尝试将我在第三段中所说的内容付诸实践,但事实并非如此。我一直收到“日期 时间 MyApp [ Number1 Number2 ] XXX 类型不会映射到任何NSDocumentClass。“从NSLog调试屏幕,其中 XXX 是我从defaultType返回的字符串。尝试了MIME类型和UTI。我现在很难过。

相关问题