簡體   English   中英

使用NSPredicateEditor編輯NSPredicate

[英]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)

NSPredicateEditorobjectValue屬性設置為有問題的謂詞。

文檔對加載過程進行了說明。 是否似乎會導致您的設置出現問題?

首先,創建一個NSPredicateEditor實例,並通過nib文件或以編程方式在其上設置一些行模板。 謂詞編輯器所做的第一件事是使用templateViews向每個模板詢問其視圖。

設置謂詞編輯器后,通常會向其發送setObjectValue:消息以恢復保存的謂詞。 NSPredicateEditor需要確定其哪個模板應在謂詞樹中顯示每個謂詞。 它通過向其每個行模板發送matchForPredicate:消息並選擇返回最高值的消息來做到這一點。

找到謂詞的最佳匹配之后,NSPredicateEditor復制該模板以獲取新鮮的視圖,將其插入適當的行,然后使用setPredicate:在模板上設置謂詞。 在該方法內,NSPredicateEditorRowTemplate對象必須設置其視圖的值來表示該謂詞。

接下來,NSPredicateEditorRowTemplate通過發送displayableSubpredicatesOfPredicate:消息向模板詢問謂詞的“可顯示子謂詞”。 如果模板完整地表示謂詞,或者該謂詞沒有子謂詞,則模板可以為此返回nil。 否則,它應返回將要制成該模板行的子行的謂詞列表。 每個子謂詞都會重復整個過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM