首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSPrintInfo printSettings不兼容KVO,尽管头中有这样的评论

NSPrintInfo printSettings不兼容KVO,尽管头中有这样的评论
EN

Stack Overflow用户
提问于 2012-06-15 08:52:20
回答 1查看 801关注 0票数 2

背景:我在打印对话框中添加一个打印面板附件视图(使用addAccessoryController:),控件绑定到NSPrintInfo printSettings值,以便将这些值保存在打印预置中。我很难观察到printSettings的变化。我正在使用SDK10.6构建,在OSX10.7上进行测试。

下面是我所理解的代码示例,但是observeValueForKeyPath:从未被调用过:

代码语言:javascript
复制
- (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实际上是类NSPrintInfoDictionaryProxy):

代码语言:javascript
复制
- (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系统是否在正常情况下工作,并调用观察者方法:

代码语言:javascript
复制
- (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修改,特别是知道用户何时选择了打印预置?

我还希望预览版能够自动更新

代码语言:javascript
复制
- (NSSet *)keyPathsForValuesAffectingPreview
{
  return [NSSet setWithObjects:
          @"representedObject.printSettings.foo",
          nil];
}

预览更新有一个简单的解决方法:通过直接在NSViewController本身上声明属性来添加一个间接级别。但对于打印预置的改变,我没有头绪。

最后,下面是NSPrintInfo.h中的评论:

- (NSMutableDictionary *)printSettings;

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

感谢你的任何帮助

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-28 11:46:25

我找到了一条路。在选择打印预置或更改纸张格式时,会发送一个无文档的通知,您所要做的就是添加一个观察者:

代码语言:javascript
复制
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(printInfoDidChange:) name:@"NSPrintInfoDidChange" object:nil];

这并不像绑定到printSettings键盘那样简单,而且我真的不喜欢使用无文档的通知(在可维护性方面几乎和使用私有API一样糟糕),但这是我能够找到完成任务的唯一方法。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11047459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档