2009-08-12 51 views
2

我可以使用NSPredicateEditor(NSRuleEditor的一個子類)輕鬆創建NSPredicate。我想知道的是:使用NSPredicateEditor編輯NSPredicate

如何獲取現有的NSPredicate(由編輯器創建的)並將其重新加載到編輯器中以便我可以修改它?

編輯:我試過@約翰的建議使用setObjectValue :,但那並沒有工作。讓我解釋我的設置更多:

我有一個基於文檔的可可應用程序,並且文檔窗口上只有一個NSPredicateEditor。在dataOfType:error:方法,我有:

NSPredicate * pred = [predicateEditor objectValue]; 
NSData * predicateData = [NSKeyedArchiver archivedDataWithRootObject:pred]; 
return predicateData; 

readFromData:ofType:error:方法,我有:

NSPredicate * pred = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
[predicateEditor setObjectValue:pred]; 
return (pred != nil); 

我驗證過謂詞得到正確歸檔和取消,但打開保存的謂語後,謂詞不會加載到謂詞編輯器中。 (是,謂詞編輯器被連接爲IBOutlet)

+0

您使用自定義模板嗎? – 2009-08-12 21:54:30

+0

@John不,我只是從IB庫中拖放了一個PredicateEditor。 – 2009-08-12 21:56:13

回答

5

NSPredicateEditorobjectValue屬性設置爲所討論的謂詞。

documentation有這種加載過程的說明;有沒有看起來像這可能會導致您的設置出現問題?

首先, NSPredicateEditor的實例被創建的,有些 行模板就可以了,要麼 通過筆尖文件或 編程設置。謂詞編輯器 所做的第一件事是使用 模板視圖向 中的每個模板查詢它們的視圖。

設置謂詞編輯器 後,通常會發送一個 setObjectValue:消息來還原 保存的謂詞。 NSPredicateEditor 需要確定它的哪個 模板應該在謂詞樹中顯示每個 謂詞。它 通過發送它的每個行 模板一個matchForPredicate:消息 並選擇一個返回 最高值。

找到最佳匹配的 謂語之後,NSPredicateEditor副本 該模板得到新鮮的觀點, 將它們插入到適當的行, 然後設置在 模板使用setPredicate謂語:。在 該方法中,NSPredicateEditorRowTemplate對象 必須將其視圖的值設置爲 表示該謂詞。 消息:

NSPredicateEditorRowTemplate未來通過 發送 displayableSubpredicatesOfPredicate要求 的謂詞的「顯示 子謂詞」的模板。如果模板完整地表示謂詞 謂詞,或者謂詞沒有子謂詞,則其 可以返回零。否則,它 應該返回一個謂詞列表 被做成該 模板行的子行。整個過程 爲每個子謂詞重複。

+0

用這個建議的更多信息編輯了這個問題。 – 2009-08-12 21:50:43

+0

圍繞谷歌,似乎有'NSPredicateEditor'一個或兩個怪癖,但我找不到任何會導致編輯完全忽略'-setObjectValue:'的。 – 2009-08-12 22:00:39

+0

@John(編輯之後):我可能是個問題。我剛從IB庫下載了一個NSPredicateEditor到窗口中,並將它連接到MyDocument File的Owner。我是否需要對NSPredicateEditorRowTemplates做任何特殊的事情,或者應該使用默認的工作? – 2009-08-12 22:03:27