Mise à  jour de TableView

jaja Membre
07:24 modifié dans API AppKit #1
Bonjour à  tous, je débute en programmation et j'aurai besoin d'un coup de main SVP. :why?:
Voilà  j'ai dans un projet une TableView alimentée par un NSController, avec un bouton "add" automatique(avec les bindings); j'ai aussi un bouton qui ajoute un objet au NSArray source du tableau en récupérant les données de champs de texte. Tout marche bien mais le nouvel objet ne s'affiche dans le tableau que si j'en ajoute ensuite un autre avec le bouton automatique (avec les bindings donc). J'ai essayé :

[maTable reloadData];
et
[maTable setNeedsDisplay:YES];

mais aucune des 2 méthodes ne marche. Si quelqu'un sait comment faire ...  :P

PS : bravo pour le site, c'est quand même plus facile en français  :D

Réponses

  • Eddy58Eddy58 Membre
    07:24 modifié #2
    Bienvenue sur OC !

    Normalement avec les bindings, tu n'as pas à  demander le rafraichissement de ta tableview. Le KVB (et pas KGB ;)) fait tout pour toi de ce côté là .
    Quel code utilises tu pour ton ajout manuel ? :o

    Et puis, pendant que j'y suis, puisque tu es un ptit nouveau, tu sais qu'on a toujours soif ici ?? A quoi tu aimes les offrir tes tournées générales ? :p :p
  • jaja Membre
    07:24 modifié #3
    J'ai un projet de navigateur web avec une gestion simple de marque-pages. Je veux que l'utilisateur ait 2 possibilités:
    1/ ajouter un marque-page "hors ligne" dans la table. C'est fait automatiquement par les bindings et l'action "add:" de NSArrayController; il faut ensuite renseigner les lignes de la table à  la main (nom et url)
    2/ quand l'utilisateur visite un site et veut le marquer, un dialogue lui demande un nom et ajoute l'adresse automatiquement (stringValue du champ "url"), ces 2 données sont passées à  un nouvel objet Bookmark (ma classe Modele) ajouté au NSArray source de la table. En fait c'est le même principe que la méthode "add:" de l'ArrayController mais en lui passant des arguments.

    Les 2 options marchent (en fait je viens de m'apercevoir qu'il y a un pb avec la 2e : je ne peux l'utiliser qu'une seule fois !?!) mais l'objet ajouté par la méthode 2 ne s'affiche que si je sollicite ensuite le ArrayController (par exemple en utilisant la méthode 1). Voici mon code pou la méthode 2:
    -(void)addBookmark:(id)sender {

    int rowIndex;
    //NSArrayController *Bookmarks;    //même nom ds IB ms pas reconnu (?)

    newBookmark = [[Bookmark alloc] init];
    [newBookmark setValue: [bookmarkName stringValue] forKeyPath: @properties.name];
    [newBookmark setValue: [bookmarkURL stringValue] forKeyPath: @properties.url];
    NSLog(@New Bookmark : name is %@ , url is %@", [newBookmark valueForKeyPath:@properties.name], [newBookmark valueForKeyPath:@properties.url], nil);

    [_bookmarks addObject:newBookmark];  //ne marche qu'1 fois

    [newBookmark release];
    [bookmarkName setStringValue:@";"];
    [bookmarkURL setStringValue:@";"];
    [settingsWindow orderOut:sender];

    //[bookmarkTable reloadData]; //update UI  ===> marche pas
    //[bookmarkTable setNeedsDisplay:YES];   
    }

    NB: settingsWindow est une sheet où l'utilisateur donne un nom au bookmark (comme ds FireFox).

    Je pense qu'il faudrait utiliser la méthode "add:" ou "insert:" de l'ArrayController mais je ne trouve pas comment faire. Si je fais un outlet de type NSArrayController dans ma classe Controller, l'application plante au démarage.

    Pour l'utilisation des bindings, j'ai adapté le tuto de CocoadevCentral donc dans IB j'ai: un NSArrayController "bindé" sur un NSObjectController dont l'outlet "content" pointe sur l'instance de ma classe Controller.
  • mars 2006 modifié #4
    Juste un conseil si tu débutes: évite les bindings, même si les tutos qu'on peut trouver sur le net sont très tentants. Pour ne pas s'emmeler les pinceaux, ça demande une connaissance nickel du MVC et une bonne connaissance de Cocoa. Bosser sans les bindings n'est pas spécialement plus dur, c'est juste plus long, mais au moins tu as un contrôle total de chaque étape de ton code, ce qui est très important quand on débute.
  • cargocargo Membre
    mars 2006 modifié #5
    Avec ma microscopique (mais intense) expérience des bindings, de cocoa et de coredata:
    1- Pas besoin de refresh c'est le controller qui s'en charge.
    2- Ca suffit pas d'appeler le controller par son nom, il faut faire un outlet dans IB

    //NSArrayController *Bookmarks;     //même nom ds IB ms pas reconnu (?)
    


    3- Moi je ferais une méthode createBookmark (initialization , setValue etc) dans Bookmark.m qui génère ton bookmark dans ton NSArray et une autre méthode addBookmark dans ton delegate qui appelle createBookmark et lui fournit des arguments. Ensuite tu bind ton bouton Add dans IB comme suit:
    >argument 1: le controller où il y a ton argument 1, MKP: argument1
    >argument 2 :le controller où il y a ton argument 2, MKP: argument2
    idem pour arguments 3, 4 ... si besoin est
    >target : le controller dans lequel tu veux ajouter
    >Selector Name : le nom de ta méthode add (ex addBookmark:)

    PS: J'ai une approche coredata et je débute donc sans garantie aucune, juste pour te donner une piste...
    PS pour Renaud: Tu vois que je pige pas trop mal le MVC ;)...
  • Eddy58Eddy58 Membre
    07:24 modifié #6
    Hé bien quelles complications tout ça... ???
    Perso, je connecterais mes deux boutons d'ajouts à  la méthode add du NSArrayController Bookmarks. Ensuite il suffit de sous-classer le NSArrayController Bookmarks et de surcharger sa méthode newObject. Il suffira juste à  l'intérieur de cette méthode de faire la distinction entre l'ajout automatique et l'ajout manuel, et si c'est en manuel il faut setter les properties concernées avec les textfields voulus. Puis on retourne le nouvel objet et ça doit y aller normalement...
    [tt]
    -(id)newObject
    {
    id newObject;

    newObject=[super newObject];

        if (ajoutmanuel)
        {
      [newObject setValue:[bookmarkName stringValue] forKeyPath:@properties.name];
          [newObject setValue:[bookmarkURL stringValue] forKeyPath:@properties.url];
        }
        return newObject;
    }
    [/tt]

    Sinon, je suis tout à  fait d'accord avec Renaud, les bindings sont efficaces, mais il faut acquérir les bases avant, sinon on a vite fait de s'emmêler les pinceaux en voulant modifier les recettes trouvées sur le net. :o
  • jaja Membre
    07:24 modifié #7
    Merci pour ces réponses  :)

    À Cargo: oui j'avais essayé l'outlet de type NSController et la ligne que tu cite était un pense bête que j'ai oublié d'effacer avant de poster.

    À Eddy : c'est justement ce que j'essayait de faire, merci pour l'exemple de code. ::)
    Pour l'apprentissage des bases, Renaud et toi avez bien sûr raison; d'ailleurs j'ai toujours à  portée de main mon exemplaire de "Cocoa par la pratique". J'ai déjà  une version de mon projet avec les méthodes "classiques" du data source, je voulais juste en apprendre plus sur les bindings, et quoi de mieux que de se lancer dans un projet ...
    (NB tu as raison j'ai tendance à  me compliquer la vie)

    Encore merci pour les réponses!
  • Eddy58Eddy58 Membre
    07:24 modifié #8
    dans 1143141427:

    Encore merci pour les réponses!

    Ha mais ça c'est rien du tout, par contre je reste un peu sur ma soif... :P :p :p
  • cargocargo Membre
    07:24 modifié #9
    Je voulais juste dire que les bindings c'est pas si compliqué que ça, au contraire ! Je peux le dire parce que je débute et que je commence à  plutôt bien piger comment ça fonctionne. J'ai eu quelques déclics ces derniers temps (faut dire que je me bouffe de la doc apple jusqu'à  l'indigestion). Je pense même que c'est peut-être plus facile pour un débutant de rentrer directement dans coredata+bindings que pour un pro de perdre ses bonnes vieilles habitudes ;)... Coredata+Bindings, ça oblige à  respecter le mvc quoiqu'il arrive, ça oblige à  une discipline qui est très formatrice je trouve.
    :o

  • mars 2006 modifié #10
    Si tu arrives à  commencer directement avec les bindings, je t'en félicite.

    Il y a eu sur ce forum quelques personnes qui ont essayé à  débuter avec les bindings et qui se sont cassé les dents.

    Pour la petite histoire, j'ai essayé d'apprendre Cocoa à  un de mes amis (que je considère comme une référence dans sa compréhension de l'informatique) en entammant "direct" les bindings, pour voir si c'était possible. Après 2-3 heures d'exemples et de tutos, il a été très impressionné par ce que permettaient les bindings, mais a estimé que commencer par ça était une erreur, parce qu'il avait la très nette impression qu'il manquait quelque chose. Notamment, il avait l'impression de travailler avec une boite noire où il ne comprenait pas ce qui se passait, chose extrement néfaste lorsqu'on débute.

    Donc sur base de ces 2 expériences, je déconseille de manière systématique les bindings aux personnes débutantes.

    Par contre je trouve qu'il y a une très légère contradication entre ça:

    dans 1143180578:

    Coredata+Bindings, ça oblige à  respecter le mvc quoiqu'il arrive, ça oblige à  une discipline qui est très formatrice je trouve.


    et ça:

    dans 1142771051:

    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.


    ou encore ça:

    dans 1143131268:

    Une entité coredata "groups" avec comme attribut, entre autres, un int représentant l'identifier d'une tab.
    Je bind le selectedIdentifier de la tabView au controller de "groups", avec comme MKP cet attribute, à  mon avis ça peut gazer...


    Donc t'auras compris que pour moi, t'as toujours rien compris au MVC. Donc prétendre que ça oblige à  le respecter est faux car visiblement tu ne sais meme pas ce que c'est, en pratique du moins. Ton expérience me convainc encore plus de ce que j'avance. (note si tu as des questions sur le MVC crée un sujet et pose les, mais je ne vais pas m'amuser à  inventer des questions dans des sujets où ça n'a rien à  voir).

    Les bindings sont très restrictifs quant à  la manière de structurer un programme et à  leur usage, ne connaitre que ce type de mécanisme est une erreur. "L'ancienne" méthode a énormément d'avantages, comme la souplesse et la transparence. Alors non, le pro n'a pas du mal à  perdre ses habitudes, il connait les 2 et utilise l'un ou l'autre suivant le but auquel il doit arriver.
  • muqaddarmuqaddar Administrateur
    07:24 modifié #11
    En effet, je recommande aussi de na pas se focaliser sur les bindings pour commencer. Cette boà®te noire magique ne nous fait pas comprendre tous les mécanismes de Cocoa.

    Donc, commence sans les bindings... ensuite tu t'y mettras.

    Moi, j'avais fait l'erreur de commencer avec les bindings, mais je ne comprenais pas pourquoi ça marchait... Alors je suis passé à  la méthode classique. Maintenant, je susi revenu aux bindings.

    Bon courage.
  • cargocargo Membre
    mars 2006 modifié #12
    Citation de: cargo sur 19 Mars 2006, 01:24
    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.

    Ca c'est ok, j'ai pigé depuis, c'est le code de iClass qui m'a induit en erreur...
    Citation de: cargo sur Hier à  05:27
    Une entité coredata "groups" avec comme attribut, entre autres, un int représentant l'identifier d'une tab.
    Je bind le selectedIdentifier de la tabView au controller de "groups", avec comme MKP cet attribute, à  mon avis ça peut gazer...

    Ca c'est juste une intuition, une idée, mais il faut que je teste et que je relise la doc. J'ai simplement le pressentiment que je peux arriver à  mon but avec un binding.


    ...Je ferai mieux d'effacer mes posts qui débitent d'énormes c... plutôt que de chercher à  donner des conseils moi... ;)
    Je voulais dire simplement que les bindings il faut pas en faire toute une histoire non plus, ça peut être pratique mais ça n'exclut pas de piger le fonctionnement de la "boà®te noire". J'essayais d'encourager un débutant (comme moi), parce que je trouve que la courbe de progression est relativement rapide, même si il y a une tonne de choses à  comprendre et à  maà®triser et ça ça demande du temps et de la motivation.
    Moi, je suis un peu "fast & furious", j'apprends dans toutes les directions, j'essaye, je me casse les dents, je revois mes bases, et peu à  peu ça se met en place, et j'avance...


    PS : Tiens du coup avec celui-là  je deviens planteur de pousses, c'est ma tournée...
    :p <3 :p   <3 :p <3 :p <3 :p
Connectez-vous ou Inscrivez-vous pour répondre.