cde*_*oix 2 printing macos cocoa
背景:我正在将打印面板附件视图添加到打印对话框(使用addAccessoryController:),其中控件绑定到 NSPrintInfo printSettings 值,以便这些值保存在打印预设中。我在观察 printSettings 更改时遇到困难。我正在使用 SDK 10.6 进行构建,并在 OS X 10.7 上进行测试。
这是一个代码示例,在我的理解中应该可以工作,但从observeValueForKeyPath:未被调用:
- (void)testKVO
{
NSPrintInfo *printInfo = [NSPrintInfo sharedPrintInfo];
[printInfo addObserver:self forKeyPath:@"printSettings.foo" options:0 context:NULL];
[printInfo setValue:@"bar" forKeyPath:@"printSettings.foo"]; // observeValueForKeyPath:ofObject:change:context: not called
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%s %@ :: %@", _cmd, keyPath, object);
}
Run Code Online (Sandbox Code Playgroud)
我也尝试直接观察 printSettings ,但没有成功,观察者方法也没有被调用( NSPrintInfo 返回的 printSettings 实际上是 class NSPrintInfoDictionaryProxy):
- (void)testKVO
{
NSMutableDictionary *printSettings = [[NSPrintInfo sharedPrintInfo] printSettings];
[printSettings addObserver:self forKeyPath:@"foo" options:0 context:NULL];
[printSettings setValue:@"bar" forKey:@"foo"]; // observeValueForKeyPath:ofObject:change:context: not called
}
Run Code Online (Sandbox Code Playgroud)
我仔细检查了我的 KVO 系统是否在正常情况下工作并调用了观察者方法:
- (void)testKVO
{
NSMutableDictionary *printSettings = [NSMutableDictionary dictionary];
[printSettings addObserver:self forKeyPath:@"foo" options:0 context:NULL];
[printSettings setValue:@"bar" forKey:@"foo"]; // observeValueForKeyPath:ofObject:change:context: called at last!
}
Run Code Online (Sandbox Code Playgroud)
所以问题是:如何观察 printSettings 的修改,特别是了解用户何时选择了打印预设?
我还希望预览能够自动更新
- (NSSet *)keyPathsForValuesAffectingPreview
{
return [NSSet setWithObjects:
@"representedObject.printSettings.foo",
nil];
}
Run Code Online (Sandbox Code Playgroud)
对于预览更新有一个简单的解决方法:通过直接在 NSViewController 本身上重新声明属性来添加间接级别。但对于打印预设的更改我不知道。
最后,这是 NSPrintInfo.h 中的注释:
- (NSMutableDictionary *)printSettings;打印信息的打印设置。您可以将值放入此字典中,以将它们存储在用户使用打印面板编辑此打印信息时创建的任何预设中。此类值必须是属性列表对象。此类是与“printSettings”兼容的键值编码 (KVC) 和键值观察 (KVO),因此您通常可以将打印面板附件视图中的控件直接绑定到此字典中的条目。您还可以使用此字典获取打印系统其他部分设置的值,例如打印机驱动程序的打印对话框扩展(与 Carbon Printing Manager 的 PMPrintSettingsGetValue() 函数返回的值相同)。打印系统的其他部分经常使用诸如“com.apple.print.PrintSettings.PMColorSyncProfileID”之类的键字符串,但是键字符串中的点与 KVC 不能很好地配合,因此这些点将被替换为出现在此处的键中的下划线字典,如“com_apple_print_PrintSettings_PMColorSyncProfileID”。向此词典添加条目时应使用相同的约定。
任何帮助表示赞赏
谢谢
好吧,我找到了办法。当选择打印预设或更改纸张格式时,会发送一条未记录的通知,您所要做的就是添加一个观察者:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(printInfoDidChange:) name:@"NSPrintInfoDidChange" object:nil];
Run Code Online (Sandbox Code Playgroud)
这并不像绑定到 printSettings 键路径那么简单,而且我真的不喜欢使用未记录的通知(在可维护性方面几乎与使用私有 API 一样糟糕),但这是我能找到完成这项工作的唯一方法。
| 归档时间: |
|
| 查看次数: |
847 次 |
| 最近记录: |