我正在尝试使用带有(计划的)WebKit控件的面向NSDocument的应用程序(在OS X Mavericks上)。我注意到,如果所有文档类型都是Viewer或Other,则禁用“New”菜单命令。我正在制作一个网络浏览器,所以应用程序不应该是任何东西的编辑器,但这就是我需要启用新命令。
我想我需要覆盖一些东西,但在哪里?显而易见的候选者是NSDocument子类,NSDocumentController子类或应用程序委托。第一个是我到目前为止实际拥有的唯一一个(即由Xcode的默认代码包含),但NSDocument实例创建新代码似乎不合适。所以我必须创建一个NSDocumentController或NSApplicationDelgate子类才能做到这一点,对吗?
答案 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。我现在很难过。