Modifica di un NSPredicate utilizzando NSPredicateEditor
-
13-09-2019 - |
Domanda
posso creare un NSPredicate facilmente utilizzando un NSPredicateEditor (una sottoclasse di NSRuleEditor). Quello che mi piacerebbe sapere è questo:
Come posso prendere un NSPredicate esistente (quello creato dal curatore) e ricaricarla in l'editor in modo che possa alterarlo?
EDIT: Ho provato @ il suggerimento di Giovanni di utilizzare setObjectValue :, ma che non ha funzionato del tutto. Mi spiego il mio set up un po 'di più:
Ho un cacao app documento-based, e la finestra del documento ha solo un NSPredicateEditor su di esso. Nel metodo dataOfType:error:
, ho:
NSPredicate * pred = [predicateEditor objectValue];
NSData * predicateData = [NSKeyedArchiver archivedDataWithRootObject:pred];
return predicateData;
Nel metodo readFromData:ofType:error:
, ho:
NSPredicate * pred = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[predicateEditor setObjectValue:pred];
return (pred != nil);
Ho verificato che il predicato è sempre correttamente archiviato e non archiviato, ma dopo l'apertura di un predicato salvato, il predicato non viene caricato nella predicateEditor. (Sì, predicateEditor è collegato come un IBOutlet)
Soluzione
Impostare la proprietà objectValue
del NSPredicateEditor
al predicato in questione.
Il documentazione ha questa descrizione del processo di caricamento; Se tutto questo vi sembra come potrebbe causare un problema con la configurazione?
In primo luogo, un'istanza di NSPredicateEditor è creato, e un po ' Modelli di riga sono impostati su di esso: o attraverso un file pennino o a livello di codice. La prima cosa editor di predicato non è chiedere a ciascuno di i modelli per le loro opinioni, utilizzando templateViews.
Dopo aver impostato l'editor predicato, in genere si invia un setObjectValue: messaggio a ripristinare un predicato salvato. NSPredicateEditor deve determinare quale della sua modelli dovrebbero visualizzare ogni predicato nella albero predicato. esso fa questo inviando ogni sua fila Modelli un matchForPredicate: messaggio e scegliere quello che restituisce il più alto valore.
Dopo aver trovato la migliore corrispondenza per un predicato, copie NSPredicateEditor tale modello per ottenere i pareri fresche, li inserisce nella riga corretta, e quindi imposta il predicato sulla modello utilizzando setPredicate :. Entro tale metodo, la oggetto NSPredicateEditorRowTemplate deve impostare i valori le sue opinioni to rappresentare quel predicato.
NSPredicateEditorRowTemplate successiva chiede il modello per la “visualizzabile sub-predicati”del predicato da l'invio di un displayableSubpredicatesOfPredicate: Messaggio. Se un modello rappresenta una predicato nella sua totalità, o se la predicato non ha subpredicates, si può restituire nil per questo. In caso contrario, dovrebbe restituire un elenco dei predicati a essere trasformato sottofila di tale fila del modello. L'intero processo ripete per ogni sotto-predicato.