Init ou pas init

gifagifa Membre
22:50 modifié dans API AppKit #1
Bonjour tout le monde!

Je réalise un projet en objective_C, le déroulement du programme passe par
initWithFrame d' un NSView
awakeFromNib du controleur
setControleur du NSView

Ensuite j'ai rajouter une fenêtre avec un NSTableView  qui est appelé par le menu
J'utilise les Bindings pour gérer le NSTableView
lien du NSArrayController au NSObjectController bind to : NSObjectController
   Controller Key  : selection
  Model Key Path : resultatsJeu

Dans le controleur j'avais ajouté dans le awakeFromNib l'initialisation du contenu du NSTableView
ainsi que l'accesseur suivant ( accesseur est il le bon mot dans ce cas ? )
- (NSMutableArray *) resultatsJeu { return enregistrements; }

le déroulement du programme devient
initWithFrame d' un NSView
resultatsJeu du controleur
awakeFromNib du controleur
setControleur   du NSView
et lorsque  j'appelle ma fenêtre le NSTableView est vide !

Pour avoir un affichage correct du NSTableView j'ai rajouter un init au controleur pour l'initialisation du contenu du NSTableView et le déroulement du programme devient
init  du controleur
initWithFrame d' un NSView
resultatsJeu du controleur
awakeFromNib du controleur
setControleur   du NSView 

Est il normal de mettre un init et un awakeFromNib dans le controleur ?
Ou tout mettre dans le init ?, ou bien j'ai tout faut ?

Réponses

  • fouffouf Membre
    22:50 modifié #2
    le programme appelle awakeFromNib quand les connections (outlets et actions) ont été reliés. Init est appele avant. Donc tu dois initialiser les valeurs (NSString, float, ...) dans le init, puis si tu as des choses a faire quand le fichier nib lorsqu'il se lance( en l'occurence la MaJ de la tableView), tu les mets dans le awakeFromNib.

    Par contre je pense que tu te trompe dans l'usage des bindings :
    Tu dois faire NSTableView bind to NSArrayController.
    Ensuite tu dois creer une classe ResultatJeu qui aura les valeurs (key) points et niveau par exemple (il ne faut pas oublier les accesseurs). Dans les attributs de NSArrayController, tu definis le Object Class Name comme ResultatJeu, puis tu entre les deux "key".

    Dans le Controlleur, tu declares la méthode updateTable et ecrit la methode qui te permet d'ajouter les objets a ton NSArrayController.

    Suis-je clair (pas sur) ?

    Si tu veux un exemple n'hésite pas.
  • gifagifa Membre
    22:50 modifié #3
    Merci pour la réponse
    Je ne croit pas me tromper en utilisant les bindings

    Je n'ai besoins que de 2 choses => afficher  des résultats qui sont dans un NSMutableArray
    avec les avantages associés à  une NSTableView
    ( affichage en temps réel, tri ...  )
    => Récupérer un  numéro de jeu dans le NSTableView

    Avec les bindings je n'ai écrit que la ligne de code
    - (NSMutableArray *) resultatsJeu { return enregistrements; }
  • ClicCoolClicCool Membre
    22:50 modifié #4
    Salut gifa et bienvenu sur O.C.  :)

    J'ai un peu de mal à  suivre exactement ton système:
    - tu parles de controller sans que je sois certain à  chaque fois qu'il s'agisse d'un binding-contrôlleur ou du contrôleur de ton appli et du document ou ....
    - Au niveau du contrôleur de binding (BdCtrl), ou plutôt des BdCtrls: il semble que tu t'appuis sur le couple NSArray-CTRL + NSObject-CTRL permettant le lien (depuis IB) entre la table View et le contrôleurGénéral ? C'est à  dire que tous les 3 sont instanciés dans le nib, c'est ça ?

    Alors tu n'as besoin que du awakeFromNib pour tout paramétrer au niveau des bindings. En ajoutant toutefois un [ArrayCtrl rearrangeObject] en fin de paramétrage pour forcer la prise en compte des valeurs que tu as probablement initialisées en shuntant les accesseurs et surtout avant que le KVO soit pleinement opérationnel (dans le init le KVO n'est pas du tout opérationnel par exemple)

    dans 1110707997:

    Dans le controleur j'avais ajouté dans le awakeFromNib l'initialisation du contenu du NSTableView
    ainsi que l'accesseur suivant ( accesseur est il le bon mot dans ce cas ? )
    - (NSMutableArray *) resultatsJeu { return enregistrements; }


    Là  par contre, pour tes accesseurs j'ai de sérieux doutes:
    Si ton array s'appelle enregistrements, l'accesseur getter doit s'appeler enregistrements et non pas resultatsJeu.
    De même il serait utile d'ajouter un accesseur de type setter ( setEnregistrements ou setResultatsJeu) puisque ton array est mutable.

    Pour les autres accesseurs (accès aux éléments du jeu de résultat) tu peux en effet laisser les bindings causer directement avec les accesseurs du mutableArray que tu lui fourni.
  • gifagifa Membre
    22:50 modifié #5
    Bonjour,
    dans 1110874662:

    - Au niveau du contrôleur de binding (BdCtrl), ou plutôt des BdCtrls: il semble que tu t'appuis sur le couple NSArray-CTRL + NSObject-CTRL permettant le lien (depuis IB) entre la table View et le contrôleurGénéral ? C'est à  dire que tous les 3 sont instanciés dans le nib, c'est ça ?

    OUI
    Mon array s'appelle resultatsJeu ( je l'appeler auparavant NSMutableArray )
    Le NSMutableArray s'appelle enregistrements, il est initialisé par la lecture sur fichier
    Lorsque j'initialise le NSMutableArray par init il y a bien la communication avec la tableView .Toutes les modifications faites lors du déroulement du programme sont bien transmissent a la tableView
    Si j'initialise le NSMutableArray par awakeFromNib aucune communication

    - (NSArray *) resultatsJeu  { return enregistrements; }
    Si je remplace resultatsJeu par enregistrements cela ne change rien
  • ClicCoolClicCool Membre
    22:50 modifié #6
    dans 1110956555:
    Toutes les modifications faites lors du déroulement du programme sont bien transmissent a la tableView

    Y compris l'ajout/supression de lignes ?

    dans 1110956555:
    Si j'initialise le NSMutableArray par awakeFromNib aucune communication

    Quand tu dis que tu initialise tu veux dire le remplir de tes valeur de dépard ? As-tu-bien ajouté ça après ta manip sur le mutable array ?
    dans 1110874662:
    .../.... En ajoutant toutefois un [ArrayCtrl rearrangeObjects ] .../...

    (Sans oublier, comme je l'avais fait, le s à  Objects)
    D'une façon générale le bindings ne nécessitent pas d'intervention au niveau du init.
  • gifagifa Membre
    22:50 modifié #7
    dans 1110961877:

    Y compris l'ajout/supression de lignes ?

    OUI par la modification du NSMutableArray *enregistrements
    dans 1110961877:

    Quand tu dis que tu initialise tu veux dire le remplir de tes valeur de dépard ? As-tu-bien ajouté ça après ta manip sur le mutable array ?

    Chargement du NSMutableArray *enregistrements a partir d'un fichier
    dans 1110961877:

    (Sans oublier, comme je l'avais fait, le s à  Objects)
    D'une façon générale le bindings ne nécessitent pas d'intervention au niveau du init.

    Je n'arrive pas a faire communiquer le  NSMutableArray avec la tableView car le
    - (NSArray *) resultatsJeu  { return enregistrements; }
    est toujours exécuter avant le awakeFromNib


    [Fichier joint supprimé par l'administrateur]
Connectez-vous ou Inscrivez-vous pour répondre.