2

背景:我将打印面板附件视图添加到打印对话框(使用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);
}

我也试过直接观察 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
}

我仔细检查了我的 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!
}

所以问题是:如何观察 printSettings 的修改,尤其是知道用户何时选择了打印预设?

我还希望预览自动更新

- (NSSet *)keyPathsForValuesAffectingPreview
{
  return [NSSet setWithObjects:
          @"representedObject.printSettings.foo",
          nil];
}

预览更新有一个简单的解决方法:通过直接在 NSViewController 本身上重新声明属性来添加间接级别。但是对于打印预设的更改,我一无所知。

最后,这是 NSPrintInfo.h 中的注释:

- (NSMutableDictionary *)printSettings;

打印信息的打印设置。您可以将值放入此字典中,以将它们存储在用户在使用打印面板编辑此打印信息时创建的任何预设中。此类值必须是属性列表对象。此类符合“printSettings”的键值编码 (KVC) 和键值观察 (KVO),因此您通常可以将打印面板附件视图中的控件直接绑定到此字典中的条目。您还可以使用此字典来获取已由打印系统的其他部分设置的值,例如打印机驱动程序的打印对话框扩展(与 Ca​​rbon 打印管理器的 PMPrintSettingsGetValue() 函数返回的相同类型的值)。打印系统的其他部分通常使用诸如“com.apple.print.PrintSettings.PMColorSyncProfileID”之​​类的键字符串 但是像键字符串中的点不能很好地与 KVC 配合使用,因此这些点被替换为出现在此字典中的键中的下划线,如“com_apple_print_PrintSettings_PMColorSyncProfileID”。向此词典添加条目时应使用相同的约定。

任何帮助表示赞赏

谢谢

4

1 回答 1

4

好吧,我找到了一种方法。选择打印预设或更改纸张格式时会发送一个未记录的通知,您所要做的就是添加一个观察者:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(printInfoDidChange:) name:@"NSPrintInfoDidChange" object:nil];

这不像绑定到 printSettings 键路径那么简单,而且我真的不喜欢使用未记录的通知(在可维护性方面几乎与使用私有 API 一样糟糕),但这是我能想出完成这项工作的唯一方法。

于 2012-06-28T11:46:25.667 回答