背景:我正在将打印面板附件视图添加到打印对话框(使用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实际上是类
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),因此您通常可以将打印面板附件视图中的控件直接绑定到此词典中的条目。您还可以使用此词典获取由打印系统其他部分设置的值,例如打印机驱动程序的打印对话框扩展名(与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];
这并不像绑定到printSettings键路径那么简单,而且我真的不喜欢使用未记录的通知(就可维护性而言,它几乎与使用私有API一样糟糕),但这是我想出的唯一方法。
关于macos - 尽管标题中有注释,但NSPrintInfo printSettings不符合KVO,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11047459/