[Bindings] Comment ajouter au Modèle une clé non gérée par la couche View ?

Eddy58Eddy58 Membre
novembre 2005 modifié dans API AppKit #1
De ce que j'ai appris jusqu'à  maintenant des bindings, les réglages s'effectuent dans les Views sous IB, pour lesquelles on défini le NSController pour lesquelles elles sont bindées, le "Model Key Path" qui renseigne la View sur l'accesseur qu'elle doit utiliser, et d'autres choses que je passerais. Tout ça est trés bien. :)
Je me demande maintenant comment rajouter au modèle une clé qui n'a pas à  être prise en compte par la couche View, genre par exemple un identifiant unique servant à  une comparaison des instances, ces instances étant dans deux arrays différents.
Dans un code "traditionnel", on aurait quelque chose ressemblant à  ceci :
[tt]
ClasseModele *objetDeClasseModele1;
ClasseModele *objetDeClasseModele2;

if(objetDeClasseModele1 uniqueID] isEqualToString:[objetDeClasseModele2 uniqueID)
{
...
}
[/tt]
Comment mettre en oeuvre un tel système avec les bindings ? C'est à  dire dans un premier temps, intégrer l'accessorisation "uniqueID", puis ensuite faire en sorte qu'elle soit gérée par le NSArrayController ? ???

[EDIT] Je me suis planté de rubrique, ce topic doit être dans "Gestion des données". Merci à  monsieur le modo de le déplacer. ;)

Réponses

  • 15:46 modifié #2
    Pour gérer l'accessorisation de uniqueID, tu sous-classes NSArrayController et surcharges -newObject (qui vient de NSObjectController).

    Par contre pour la deuxième partie, je ne vois pas ce que tu veux dire par "faire en sorte qu'elle soit gérée par le NSArrayController".

    De rien ;)
  • Eddy58Eddy58 Membre
    15:46 modifié #3
    Ok, merci Renaud. :)
    J'ai pas le temps de tester dans l'immédiat, mais le code suivant rajoutera donc à  chaque nouveau dictionary la clé "uniqueID" ?
    [tt]
    -(id)newObject
    {
        newObject=[super newObject];
        [newObject setValue:@0A1B2C forKey:@uniqueID];
        return newObject;
    }
    [/tt]
    Sinon, par "faire en sorte qu'elle soit gérée par le NSArrayController", j'entendais par là  que la clé ajoutée par programmation soit gérée comme les clés définies dans IB, sans rajout de programmation pour le tri ou autres opérations. Mais apparemment pas besoin, et si j'ai bien compris, avec la méthode newObject, la clé va tout simplement se greffer au nouveau dictionary ?
  • 15:46 modifié #4
    Effectivement pas besoin de code particulier pour la clé uniqueid autre que le newobject. C'est pour ça que je pigeais pas la question.

    J'ai vu que j'ai zappé l'aspect comparaison entre deux instances. Ce n'est a priori pas possible de faire ça directement, vu qu'un arraycontroller ne sait jamais gérer qu'un tableau. Par contre si tu dis ce à  quoi tu veux arriver, il y a peut être quelque chose de mieux.
  • Eddy58Eddy58 Membre
    15:46 modifié #5
    Et bien en faites, actuellement je n'ai pas besoin d'arriver à  quelque chose de particulier, même si pour mes prochains développements j'ai prévu d'utiliser les bindings et Core Data. Là  j'apprend plus à  me servir de tout ça, et là  pour l'instant je réfléchis par rapport à  mes anciens projets comment je pourrais transposer des parties de mon code "traditionnel" en bindings, en mettant en oeuvre lors d'essais.

    Par exemple, dans mon dernier projet, à  chaque nouvelle instance de ma classe modèle j'associe un identifiant unique, qui sert à  comparer les instances de même classe modèle. Car dans ce projet, il y a un array normal qui est composé de toutes les instances, et un array filtré en fonction des critères de recherches. La visualisation des instances des deux arrays se fait dans la même tableview, par permutation. Seulement, quand une instance est modifiée ou effacée dans un array, il faut la retrouver dans l'autre array via son identifiant et effectuer l'opération de modification ou d'effacement.
    Tu va me dire, l'utilisation de NSMutableSet aurait peut-être simplifié la chose, mais je ne m'y suis pas attardé car j'étais bien parti avec NSMutableArray.

    Là , avec NSArrayController, je pense qu'on peut arriver à  ça avec les méthodes "arrangeObjects" pour la recherche par critères,"removeObject" pour l'effacement et les méthodes KVC pour la modification, mais je n'ai pas creusé plus de ce côté là . Mais tout les conseils sont les bienvenus. :)
  • 15:46 modifié #6
    Je vais surtout te dire que maintenir deux arrays ne sert à  rien dans ce cas: nsarraycontroller dissocie ce qui est affiché (auquel tu accèdes avec arrangedObjects) et le contenu sensus stricto (content). Donc si tu effaces un élément d'un côté, il sera automatiquement effacé de l'autre.
  • Eddy58Eddy58 Membre
    15:46 modifié #7
    Ha ça c'est bien cool alors, je vois que tout est prévu, une fois que l'on sait se servir de tout ça on doit bien y gagner son temps. :)
Connectez-vous ou Inscrivez-vous pour répondre.