【发布时间】:2012-12-02 14:59:06
【问题描述】:
当用户在基于NSDocument 的 Cocoa 应用程序中创建新文档时,我希望新文档窗口显示一个表单,用户可以在其中设置一些初始文档参数。
但是,当通过“文件”>“打开”加载现有文档时,不应显示此工作表。
是否有任何现有的机制可以用来实现这一点?或者有什么推荐的方法吗?
【问题讨论】:
标签: macos cocoa nsdocument
当用户在基于NSDocument 的 Cocoa 应用程序中创建新文档时,我希望新文档窗口显示一个表单,用户可以在其中设置一些初始文档参数。
但是,当通过“文件”>“打开”加载现有文档时,不应显示此工作表。
是否有任何现有的机制可以用来实现这一点?或者有什么推荐的方法吗?
【问题讨论】:
标签: macos cocoa nsdocument
在您的 NSDocument 子类中覆盖 initWithType:error:。
来自文档(参见NSDocument Class Reference):
您可以重写此方法来执行创建新文档时必须执行但打开现有文档时不应执行的初始化。
【讨论】:
beginSheet... 方法?如果我把它放在initWithType:error: 中,工作表会显示在它自己的窗口中,而不是作为工作表附加到文档窗口。
Jay 在his answer 中正确指出,为了确定NSDocument 子类的实例是否代表新文档而不是从文件加载的文档,initWithType:error: 必须被覆盖,它只会被调用对于新文件。但不幸的是,在那里启动工作表将不起作用,因为在调用 initWithType:error: 时尚未创建窗口。
获得这个工作的缺失链接是设置一个名为例如的实例变量。 newDocument 到 YES 在 initWithType:error:。那么,对[NSApp beginSheet:…] 的实际调用必须在windowDidBecomeKey: 中进行。此外,newDocument 变量应在此处设置为NO,以防止每次窗口再次成为键时工作表都重新出现。
【讨论】: