Bindings : récupérer la sélection d'une tableView dans le code

cargocargo Membre
07:57 modifié dans API AppKit #1
La question est dans le titre...Je souhaite récupérer l'objet sélectionné dans la tableView à  un moment donné. Il faut parler au controller ? Comment appelle-t-on le arrayController qui gère la class que l'on implémante ? On l'instancie dans le code et c'est tout ?

Réponses

  • 07:57 modifié #2
    fait un outlet dans IB pour avoir le arrayController. Tu auras la sélection en appelant selectedObjects (renvoie un tableau, qui peut ne contenir qu'un seul objet) sur l'array controller. Il y a aussi une méthode selection, mais pour utiliser l'objet renvoyé il y a quelques subtilités.
  • cargocargo Membre
    07:57 modifié #3
    J'ai pas l'impression qu'il y ait besoin d'outlets avec Coredata. Regarde ce code :
    <br />- (void)signUpToTeach:(NSArray*)course {<br />&nbsp; &nbsp; Course* realCourse = [course objectAtIndex: 0];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // set the teacher relationship on the course, since courses is a fetched property<br />&nbsp; &nbsp; // on teacher and can&#39;t be modified. Then force a refresh to pick up the new course.<br />&nbsp; &nbsp; [realCourse setValue: self forKey: @&quot;teacher&quot;];<br />&nbsp; &nbsp; [[self managedObjectContext] refreshObject: self mergeChanges: YES];<br />}<br /><br />
    


    C'est bindé à  un bouton Add qui invoque la fonction signUpToTeach: avec en argument et en target 2 controllers. Y a pas d'outlets nulle part.
    Un tableau, tu veux dire un NSArray ?
    Quelque chose comme ça ?
    (NSArray*)monObjet = [(NSArrayController*)leNomDuControllerDansIB selectedObjects]

    Sinon pour selection il faut gérer les multiples sélections éventuelles ou les sélections vides c'est ça ?

    PS: Dans le code plus haut Course*realCourse est une instance de la classe course, quand je fais ça dans une fonction qui n'est pas une fonction void ça marche pas, il ne veux pas que j'utilise un nom de classe, bizarre...
  • 07:57 modifié #4
    dans 1142016197:

    J'ai pas l'impression qu'il y ait besoin d'outlets avec Coredata. Regarde ce code :


    Les bindings (ce n'est pas lié spécialement à  CoreDate) permettent de diminuer le nombre d'outlets nécessaires, mais il ne faut pas perdre de vue que les bindings sont un mécanisme qui peut être assez gourmand en ressources (plus en tout cas que sans bindings) et que parfois il vaut mieux passer par un bon vieil outlet. Comme ta question est "récupérer la sélection de la table à  un moment donné", l'outlet est une solution simple à  mettre en ½uvre.

    L'idée derrière les bindings (en général) n'est pas de connaà®tre une valeur a un moment donné, mais de notifier les changements de valeurs. Pour ton problème cela répondrait plutôt à  la question "notifier les changements de sélection", dans ce cas ce n'est pas spécialement compliqué - rajouter une variable d'instance représentant l'objet sélectionné et binder le selectedObject au File's owner (ou l'instance d'un contrôleur) et mettre comme keypath le nom de la variable.

    dans 1142016197:

    Un tableau, tu veux dire un NSArray ?

    [...]

    Sinon pour selection il faut gérer les multiples sélections éventuelles ou les sélections vides c'est ça ?


    Oui oui.
  • cargocargo Membre
    07:57 modifié #5
    Le problème ici c'est que les entités sous-classées de coredata (une entité dont on a généré les files) ne sont pas importables dans IB, donc je vois mal comment créer les outlets dans IB.

    C'est au niveau du code de l'entité A (entitéA.m), que je veux récupérer la sélection d'un arrayController. Cet arrayController contrôle une autre entité B.
    Dans IB, je dois lier les controllers de A et B entre eux avec un outlet ? Et ensuite dans le header de l'entité A, IBOutlet etc... ?

    Et pour info j'aimerais aussi savoir comment on récupère la sélection du controller de A dans le code de A.

    Voilà  ! Récupérer la sélection dans le File's owner (NSPersistentDocument *MyDocument), no problem puisqu'il est instancié dans IB.
  • 07:57 modifié #6
    Tu mélanges pas un peu tout là ?
  • cargocargo Membre
    07:57 modifié #7
    Non !  ;D

  • mars 2006 modifié #8
    Bonne chance alors...

    Je te conseille de revoir tes bases en tout cas. Notamment la notion de MVC...
Connectez-vous ou Inscrivez-vous pour répondre.