[英]Editing an NSPredicate using NSPredicateEditor
我可以使用NSPredicateEditor(NSRuleEditor的子類)輕松創建NSPredicate。 我想知道的是:
如何獲取現有的NSPredicate(由編輯器創建的)並將其重新加載到編輯器中,以便進行更改?
編輯:我嘗試了使用setObjectValue:的@John的建議,但是效果不佳。 讓我再解釋一下我的設置:
我有一個基於文檔的可可應用程序,“文檔”窗口上只有一個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);
我已驗證謂詞已正確存檔和取消存檔,但是在打開保存的謂詞后,該謂詞不會加載到predicateEditor中。 (是的,predicateEditor被連接為IBOutlet)
將NSPredicateEditor
的objectValue
屬性設置為有問題的謂詞。
該文檔對加載過程進行了說明。 是否似乎會導致您的設置出現問題?
首先,創建一個NSPredicateEditor實例,並通過nib文件或以編程方式在其上設置一些行模板。 謂詞編輯器所做的第一件事是使用templateViews向每個模板詢問其視圖。
設置謂詞編輯器后,通常會向其發送setObjectValue:消息以恢復保存的謂詞。 NSPredicateEditor需要確定其哪個模板應在謂詞樹中顯示每個謂詞。 它通過向其每個行模板發送matchForPredicate:消息並選擇返回最高值的消息來做到這一點。
找到謂詞的最佳匹配之后,NSPredicateEditor復制該模板以獲取新鮮的視圖,將其插入適當的行,然后使用setPredicate:在模板上設置謂詞。 在該方法內,NSPredicateEditorRowTemplate對象必須設置其視圖的值來表示該謂詞。
接下來,NSPredicateEditorRowTemplate通過發送displayableSubpredicatesOfPredicate:消息向模板詢問謂詞的“可顯示子謂詞”。 如果模板完整地表示謂詞,或者該謂詞沒有子謂詞,則模板可以為此返回nil。 否則,它應返回將要制成該模板行的子行的謂詞列表。 每個子謂詞都會重復整個過程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.