Bindings "on the fly"
Tiff
Membre
Dans la doc Apple sur les bindings, traduite par ProjectOmega, on trouve l'exemple des combattants, avec un menu pop-up et des accesseurs indexés.
http://www.projectomega.org/article.php?lg=fr&php=tuts_cocoaBindings&p=1
Tout fonctionne pour le tableau des combattants et le titre de la fenêtre.
Mais pb avec le pop-up :
Combattants[2315] An uncaught exception was raised
Combattants[2315] [<NSConstantString 0xf4024> valueForUndefinedKey:]: this class is not key value coding-compliant for the key selectedWeapon.
Combattants[2315] *** Uncaught exception: <NSUnknownKeyException> [<NSConstantString 0xf4024> valueForUndefinedKey:]: this class is not key value coding-compliant for the key selectedWeapon.
Combattants has exited due to signal 5 (SIGTRAP).
Déjà , une question toute bête : le menu doit être lié au contrôleur via arrayedObjects.
On trouve où arrayedObjects ? J'avais essayé arrangedObjects, puis tapé arrayedObjects à la place. ça ne change rien.
Deuxième question : qu'est-ce qui ne va pas avec selectedWeapon ?
- (void)setSelectedWeapon:(NSMutableString *)aWeapon {
[aWeapon retain];
[selectedWeapon release];
selectedWeapon = aWeapon; }
- (NSMutableString *)selectedWeapon {
return selectedWeapon; }
:why?:
http://www.projectomega.org/article.php?lg=fr&php=tuts_cocoaBindings&p=1
Tout fonctionne pour le tableau des combattants et le titre de la fenêtre.
Mais pb avec le pop-up :
Combattants[2315] An uncaught exception was raised
Combattants[2315] [<NSConstantString 0xf4024> valueForUndefinedKey:]: this class is not key value coding-compliant for the key selectedWeapon.
Combattants[2315] *** Uncaught exception: <NSUnknownKeyException> [<NSConstantString 0xf4024> valueForUndefinedKey:]: this class is not key value coding-compliant for the key selectedWeapon.
Combattants has exited due to signal 5 (SIGTRAP).
Déjà , une question toute bête : le menu doit être lié au contrôleur via arrayedObjects.
On trouve où arrayedObjects ? J'avais essayé arrangedObjects, puis tapé arrayedObjects à la place. ça ne change rien.
Deuxième question : qu'est-ce qui ne va pas avec selectedWeapon ?
- (void)setSelectedWeapon:(NSMutableString *)aWeapon {
[aWeapon retain];
[selectedWeapon release];
selectedWeapon = aWeapon; }
- (NSMutableString *)selectedWeapon {
return selectedWeapon; }
:why?:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Le message d'erreur dit en effet que que ta classe Combattant n'est pas KeyValueCoding Compliante pour la propriété (variable d'instance) selectedWeapon.
C'est donc qu'il ne trouve pas les accesseurs attendus.
Ne serait-ce pas parceque le getter attendu selectedWeapon devrait renvoyer un objet de type Weapon et que de même le setter attendu devrait recevoir un objet de type Weapon, et non pas NSMutableString ??Â
Dans la mesure ou selectedWeapon est défini comme Objet de type Weapon dans Combattant.h ::)
Ben non, selectedWeapon est déclaré comme NSMutableString, tout comme weapon1, weapon2, weapon3. J'aurais du créer une classe spéciale ? Je reconnais que ce pourrait être intéressant pour une vraie appli, mais dans le cas présent, pourquoi serait-ce une source d'erreur ? ???
Dans ma version de ce tuto (du 24 février 2004) les armes sont des objets de type Weapons.
Vérifie dans le nib quel type d'objet est spécifié par les infos du contrôlleur Weapons (Object Classe Name dans le panneau Attributes).
Bizard ça ? une erreur de traduction peut-être ? ou une variante volontaire ? ???
Je n'ai pas suivi de tuto, je me suis contenté de lire les commentaires de la doc, et ai essayé de faire une appli qui correspondait.
J'avais laissé NSMutableDictionary dans Attributes. Je l'ai changé en NSMutableString, sans succès.
Tu as un tuto spécial pour cet exemple ?
Sinon, de toutes façons j'ai le code quelque part dans mon pb, il est à disposition de qui le souhaite.
où effectivement une classe Weapon est utilisée. Je vais voir.
Par contre, dans IB, il n'y a pas de contrôleur d'objet, le ArrayController Combatants ne semble pas lié à l'AppController ?
Sans doute va-t-il chercher les combattants pars accesseurs indexés aussi. J'étudie tout ça et je donne des nouvelles d'ici 48h. :P
Combattants[2315] *** Uncaught exception: <NSUnknownKeyException> [<NSConstantString 0xf4024> valueForUndefinedKey:]: this class is not key value coding-compliant for the key selectedWeapon.
Combattants has exited due to signal 5 (SIGTRAP).
J'ai le même genre d'erreurs... le pb vient-il nécessairement du manque d'accesseurs ou ça peut venir d'une mauvaise connection dans IB ?
en général c'est qu'il n'y a pas concordance entre le binding définit dans IB (ou dans le code!) et le code avec ses variables et leurs accesseurs. Au runTime le binding ne peut se mettre en place.
Ceci dit les bindings ne sont pas toujours définis sous IB.
En effet, j'ai (re)jetté un oeil sur le code des combatants dont je dispose (qui marche très bien)
J'ai remarqué que le contrôleur des weapons est bindé sous I.B. (pour sont contenu) sur le contrôleur des combattants.
MAIS sous IB le contrôleur des combattants est VIDE. Il n'y est pas défini de connexion ni de binding vers un contenu.
C'est dans le awakeFromNib de l'AppContoller qu'est mis en place "à la main" le binding définissant son contenu.
Par ailleurs, d'autres bindings sont aussi faits main ...
Ce serait pas par là que ça se passe chez vous ?
J'ai lié dans IB le Controleur Combattants à AppController via un contrôleur d'objet ; mais je n'aime pas cette méthode, qui oblige à ajouter un Controleur. Si on peut le faire avec une ligne de code, ce sera plus satisfaisant à mon goût.
Je laisse tomber pour l'instant, et je regarde les différents tuto de la page citée plus haut, pour me remettre dans le bain.
Par ailleurs, mon appli est structurée comme ça :
AppController -> GroupControlleur (NSArrayControlleur) -> SiteControleur(NSArrayControlleur)
+ le file'owner.
- Est-ce que le file'owner doit déléguer AppController ?
- Est-ce que GroupControlleur doti établir un connection outlet "content" avec AppControlleur ?
merci
C'ets marrant, ClicCool m'incitait justement à me passer de controleurObjet la semaine dernière, mais je me perds alors dans les connections...
Ou alors directement sur ton AppControleur avec la ligne de code de Clicool.
Mais je ne comprends pas pourquoi on ne peut pas le faire directement dans IB.
Dixit le commentaire du code de l'AppController.
[Fichier joint supprimé par l'administrateur]
On se demande pourquoi il n'est pas possible dans I.B. de définir un binding direct comme tu l'as défini et qui ne prend finalement qu'une ligne de code dans ton awakeFromNib.Â
J'ai bien essayé de lier la fenêtre au contrôleur par title Bind to popUpController with key selection dans IB, mais messages d'erreur.
Bien sûr sans créer de classe Jour, avec une propriété nomDuJour.
Qui sera chargée de conserver la sélection actuelle du popup
Puis de binder la propriété "selectedObject" de ton pop up sur cette chaine.
Soit programmatiquement (le plus propre)
Soit en créant un NSObjectController intermédiare ....
Puis tu bindes la propriété titre de ta fenêtre sur leJour.Â
Tu n'as plus qu'à ajouter ces 2 lignes dans ton awakeFromNib: 8)
[Fichier joint supprimé par l'administrateur]
C'était au programme des volets à venir de mon tuto. mais là j'ai pas assez de temps pour l'écrire et il commence à y avoir pas mal d'exemples sur le net ...
Un bon exrecice ;D