2009-08-12 8 views
2

Je peux créer facilement un NSPredicate à l'aide d'un NSPredicateEditor (une sous-classe de NSRuleEditor). Ce que j'aimerais savoir, c'est ceci:Modification d'un NSPredicate à l'aide de NSPredicateEditor

Comment puis-je prendre un NSPredicate existant (créé par l'éditeur) et le recharger dans l'éditeur pour pouvoir le modifier?

EDIT: J'ai essayé @ la suggestion de John d'utiliser setObjectValue :, mais cela n'a pas vraiment fonctionné. Laissez-moi vous expliquer un peu plus ma configuration:

J'ai une application de cacao basée sur un document, et la fenêtre de document a juste un NSPredicateEditor dessus. Dans la méthode dataOfType:error:, je:

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

Dans la méthode readFromData:ofType:error:, j'ai:

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

J'ai vérifié que le prédicat est correctement archivé et se désarchivée, mais après l'ouverture d'un prédicat sauvé , le prédicat n'est pas chargé dans predicateEditor. (Oui, predicateEditor est connecté en tant qu'IBOutlet)

+0

Utilisez-vous des modèles personnalisés? –

+0

@John non Je viens de glisser et de déposer un PredicateEditor de la bibliothèque de l'IB. –

Répondre

5

Définissez la propriété objectValue du NSPredicateEditor sur le prédicat en question. Le documentation a cette description du processus de chargement; Est-ce que tout cela semble être un problème avec votre configuration?

D'abord, une instance de NSPredicateEditor est créé, et certains modèles de ligne sont fixés sur elle-soit à travers un fichier nib ou programme. La première chose que l'éditeur de prédicat fait est de demander à chacun des modèles pour leurs vues, en utilisant templateViews.

Après avoir configuré l'éditeur de prédicat, vous envoyez généralement un setObjectValue: message à restaurer un prédicat enregistré. NSPredicateEditor doit déterminer lequel de ses modèles doit afficher chaque prédicat dans l'arborescence de prédicats. Il fait cela en envoyant chacun de ses lignes modèles un matchForPredicate: message et en choisissant celui qui renvoie la plus haute valeur .

Après avoir trouvé le meilleur match pour un prédicat, copies NSPredicateEditor ce modèle pour obtenir des vues nouvelles, les insère dans la ligne appropriée et définit alors le prédicat sur le modèle en utilisant setPredicate :. Au sein de cette méthode, l'objet NSPredicateEditorRowTemplate doit définir les valeurs de ses vues à représentent ce prédicat.

NSPredicateEditorRowTemplate demande ensuite le modèle pour les « affichables sous-prédicats » du prédicat par l'envoi d'un displayableSubpredicatesOfPredicate: un message .Si un modèle représente un prédicat dans son intégralité ou si le prédicat n'a pas de sous-prédicat, il peut renvoyer zéro pour cela. Sinon, il doit renvoyer une liste de prédicats à être transformés en sous-rangées de la ligne du modèle . L'ensemble du processus se répète pour chaque sous-prédicat.

+0

Edité la question avec plus d'informations concernant cette suggestion. –

+0

Fouillant autour de Google, il semble y avoir une ou deux bizarreries avec 'NSPredicateEditor', mais je ne trouve rien qui amènerait l'éditeur à complètement ignorer' -setObjectValue: '. –

+0

@John (après l'édition): Je pourrais être un problème. J'ai juste laissé tomber un NSPredicateEditor de la bibliothèque d'IB dans la fenêtre et l'ai câblé au propriétaire du dossier de MyDocument. Ai-je besoin de faire quelque chose de spécial avec NSPredicateEditorRowTemplates, ou est-ce que ceux par défaut devraient fonctionner? –

Questions connexes