2012-06-15 32 views
2

背景:我將打印面板附件視圖添加到打印對話框(使用addAccessoryController:),並將控件綁定到NSPrintInfo的printSettings值,以便將值保存在打印預設。我有麻煩觀察printSettings的變化。我正在構建SDK 10.6,在OS X 10.7上進行測試。NSPrintInfo printSettings不符合KVO,儘管在標題中註釋如此:

下面是一個代碼示例,應該在我的理解工作,但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 
} 

我仔細檢查了我的志願系統在正常條件下工作,並調用觀察者方法:

- (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;

打印信息的打印設置。您可以將字典中的值存儲在用戶使用打印面板編輯此打印信息時創建的任何預設中。這些值必須是屬性列表對象。該類是「打印設置」的鍵值編碼(KVC)和鍵值觀察(KVO),因此您通常可以將打印面板附件視圖中的控件直接綁定到本字典中的條目。您還可以使用此字典來獲取由打印系統的其他部分設置的值,例如打印機驅動程序的打印對話框擴展名(由Carbon Printing Manager的PMPrintSettingsGetValue()函數返回的相同類型的值)。打印系統的其他部分通常使用諸如「com.apple.print.PrintSettings.PMColorSyncProfileID」之​​類的關鍵字符串,但類似於鍵字符串中的點不適用於KVC,因此這些點將替換爲出現在此處的鍵中的下劃線字典,如「com_apple_print_PrintSettings_PMColorSyncProfileID」中所示。將條目添加到此字典時應使用相同的約定。

任何幫助表示讚賞

感謝

回答

4

嗯,我找到了一種方法。有選擇的打印設定或更改文件格式時正在發送一個未公開的通知,所有你需要做的就是添加一個觀察者:

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

這不是那麼簡單,因爲結合printSettings keypaths,和我真的不喜歡使用未公開的通知(就可維護性而言,使用私有API幾乎與使用私有API一樣糟糕),但這是我能想出來完成這項工作的唯一方法。