如何获取 NSDocument 子类来打印自定义视图
How to get an NSDocument subclass to print custom views
当file-> print ...被选择时,NSDocument子类需要连接什么?
文件->打印菜单是如何连接的? (现在 selector/action 连接到第一响应者的打印方法。那是在故事板中,而我的 NSDocument 子类有自己的 xib。)
我已经尝试实施所有:
-(void)print:(id)sender;
-(void)printDocument:(id)sender;
-(void)printDocumentWithSettings:(NSDictionary *)printSettings showPrintPanel:(BOOL)showPrintPanel delegate:(id)delegate didPrintSelector:(SEL)didPrintSelector contextInfo:(void *)contextInfo;
-(NSPrintOperation*)printOperationWithSettings:(NSDictionary *)printSettings error:(NSError *__autoreleasing *)outError;
但是当我选择“打印”时,它们中的 none 会被调用。这些方法应该 go/who 在哪里调用它们? (我还尝试了一个带有自定义视图的基本应用程序,但也没有成功。)
查看 Apple 的 TextEdit 示例代码 (https://developer.apple.com/library/mac/samplecode/TextEdit/Introduction/Intro.html)
在我的非基于文档的应用程序中,我为打印菜单项设置了自定义操作。在那种方法中,我通过 NSNotificationCenter
通知我的控制器有关打印操作。也许这对你也有用:)
好的。看起来问题是由于 bug in Xcode:使用故事板创建基于文档的应用程序时,文件菜单默认挂接到 print:
并且 printDocument:
不可用。
奇怪的是,我的 print:
调用在某处被劫持,但我无法弄清楚在哪里(在应用程序级别,而不是文档,因为打印对话框是 window 不是 sheet)。 printDocument:
按预期工作,但必须手动定义才能连接它。
这适用于 document-based 应用,目标为 10.10,并使用故事板。
在带有主菜单的情节提要中,为 printDocument:
添加一个用户定义的操作(这是基于情节提要的不同之处,我认为这是一个错误。基于 Xib 的不需要此用户定义的操作。)
连接文件选择器 -> 打印到第一响应者并选择 printDocument:
而不是 print:
不要在 NSDocument 子类中定义 printDocument:
。如果您愿意,请务必调用 super
或以下方法之一。
来自NSDocument.h
/* The action of the File menu's Print... item in a document-based application.
The default implementation of this method merely invokes
[self printDocumentWithSettings:[NSDictionary dictionary]
showPrintPanel:YES
delegate:nil
didPrintSelector:NULL
contextInfo:NULL].
*/
- (IBAction)printDocument:(id)sender;
printDocumentWithSettings
的默认实现依次调用 printOperationWithSettings
,因此您可以使用这些方法中的任何一种在打印 sheet 出现之前绘制自定义信息。
将菜单项设置为 -printDocument:
的公认解决方案是正确的,但由于 Xcode 错误(技术上)不正确。 (不过,这是一个非常糟糕的默认设置。)
菜单项正在呼叫第一响应者的-print:
。 NSView 实现了 -print:
,所以如果任何东西被设置为第一响应者,你将使用 NSView 的 -print:
,而不是你的文档的 -print:
来打印。如果编辑您的文档需要文本编辑,您用来实现编辑的控件将被设置为 first-responder,并且该控件将获得 -print:
.
当file-> print ...被选择时,NSDocument子类需要连接什么?
文件->打印菜单是如何连接的? (现在 selector/action 连接到第一响应者的打印方法。那是在故事板中,而我的 NSDocument 子类有自己的 xib。)
我已经尝试实施所有:
-(void)print:(id)sender;
-(void)printDocument:(id)sender;
-(void)printDocumentWithSettings:(NSDictionary *)printSettings showPrintPanel:(BOOL)showPrintPanel delegate:(id)delegate didPrintSelector:(SEL)didPrintSelector contextInfo:(void *)contextInfo;
-(NSPrintOperation*)printOperationWithSettings:(NSDictionary *)printSettings error:(NSError *__autoreleasing *)outError;
但是当我选择“打印”时,它们中的 none 会被调用。这些方法应该 go/who 在哪里调用它们? (我还尝试了一个带有自定义视图的基本应用程序,但也没有成功。)
查看 Apple 的 TextEdit 示例代码 (https://developer.apple.com/library/mac/samplecode/TextEdit/Introduction/Intro.html)
在我的非基于文档的应用程序中,我为打印菜单项设置了自定义操作。在那种方法中,我通过 NSNotificationCenter
通知我的控制器有关打印操作。也许这对你也有用:)
好的。看起来问题是由于 bug in Xcode:使用故事板创建基于文档的应用程序时,文件菜单默认挂接到 print:
并且 printDocument:
不可用。
奇怪的是,我的 print:
调用在某处被劫持,但我无法弄清楚在哪里(在应用程序级别,而不是文档,因为打印对话框是 window 不是 sheet)。 printDocument:
按预期工作,但必须手动定义才能连接它。
这适用于 document-based 应用,目标为 10.10,并使用故事板。
在带有主菜单的情节提要中,为 printDocument:
添加一个用户定义的操作(这是基于情节提要的不同之处,我认为这是一个错误。基于 Xib 的不需要此用户定义的操作。)
连接文件选择器 -> 打印到第一响应者并选择 printDocument:
而不是 print:
不要在 NSDocument 子类中定义 printDocument:
。如果您愿意,请务必调用 super
或以下方法之一。
来自NSDocument.h
/* The action of the File menu's Print... item in a document-based application.
The default implementation of this method merely invokes
[self printDocumentWithSettings:[NSDictionary dictionary]
showPrintPanel:YES
delegate:nil
didPrintSelector:NULL
contextInfo:NULL].
*/
- (IBAction)printDocument:(id)sender;
printDocumentWithSettings
的默认实现依次调用 printOperationWithSettings
,因此您可以使用这些方法中的任何一种在打印 sheet 出现之前绘制自定义信息。
将菜单项设置为 -printDocument:
的公认解决方案是正确的,但由于 Xcode 错误(技术上)不正确。 (不过,这是一个非常糟糕的默认设置。)
菜单项正在呼叫第一响应者的-print:
。 NSView 实现了 -print:
,所以如果任何东西被设置为第一响应者,你将使用 NSView 的 -print:
,而不是你的文档的 -print:
来打印。如果编辑您的文档需要文本编辑,您用来实现编辑的控件将被设置为 first-responder,并且该控件将获得 -print:
.