effectuer un calcul lors de l'affichage d'une fenêtre

sisopetronsisopetron Membre
18:01 modifié dans API AppKit #1
Bonjour,

J'ai encore besoin de l'aide de la communauté.

Le fenêtre principale de mon appli affiche un NSTableView bindé à  un NSArray (que j'ai appelé itemList). 

N'ayant pas trouvé de méthode déléguée de type windowDidiShow, j'ai créé ma propre méthode d'affichage de la fenêtre : - (IBAction)showWindow:(id)sender;  qui est bindée à  un menu.  Jusque là  tout marche parfaitement.

Je veux qu'à  chaque fois que j'ouvre ma fenêtre, les éléments contenu dans ma tableView soient mis à  jour donc je fais ceci :
- (IBAction)showWindow:(id)sender<br />{<br />	[mainWindow orderFront:self];<br />	itemList = [self extraitAddressBook];<br />	[myTableView reloadData];<br />}


La méthode extraitAddressBook fonctionne parfaitement : elle m'affiche bien les données désirées.

Mais la mise à  jour lors de l'ouverture de la fenêtre ne se fait pas.  Comment corriger cela ?

Merci de votre aide.

tata !

Réponses

  • laudemalaudema Membre
    juillet 2010 modifié #2
    dans 1279285116:

    - (IBAction)showWindow:(id)sender<br />{<br />	[mainWindow orderFront:self];<br />	itemList = [self extraitAddressBook];<br />	[myTableView reloadData];<br />}
    


    La méthode extraitAddressBook fonctionne parfaitement : elle m'affiche bien les données désirées.

    Mais la mise à  jour lors de l'ouverture de la fenêtre ne se fait pas.  Comment corriger cela ?

    Bonjour,

    Comment ta tableView obtient elle ses données ?
    Si tu utilises un NSArrayController elles ne sera pas actualisée par 'reloadData' il te faut utiliser les bindings par définition !
    Dans ton cas si ton arrayController est lié à  itemList probable qu'un self.itemList = [self extraitAddressBook] devrait suffire.
    Tu peux aussi l'encadrer avec des
    <br />[self willChangeValueForKey:@&quot;itemList&quot;];<br />//...<br />[self didChangeValueForKey:@&quot;itemList&quot;];<br />
    

    dans 1279285116:

    N'ayant pas trouvé de méthode déléguée de type windowDidiShow

    Si tu as un windowController (= ta classe est un NSDocument) tu peux implémenter  (void)windowDidLoad
    Sinon ( = ta classe est un objet AppDelegate) tu peux mettre celui ci delegate de la fenêtre dans ton fichier xib et là  tu n'as que les methodes et notifications windowDidBecomeMain et windowDidBecomeKey pour savoir quand elle devient la fenêtre du premier plan et quand elle accepte les événements clavier mais ça permettrait d'exécuter ton code au lancement (et de le rafraichir à  chaque fois qu'elle repasse au premier plan)

  • sisopetronsisopetron Membre
    juillet 2010 modifié #3
    Merci pour ton aide.

    J'ai pu implémenter la méthode windowDidBecomeMain.

    Malheureusement, mon tableView ns s'actualise toujours pas.

    itemList = [self extraitAddressBook]; s'actualise bien par contre : j'ai les nouvelles données dans itemList mais  [myTableView reloadData]; est inopérant : la table n'est pas actualisée.

    Juste une chose : itemList est un NSMutableArray et le datasource de ma tableView.  Les modifications apportées dans le datasource sont apportées par la modification de l'AdressBook de MacOS dans lequel je vais chercher les infos, et pas par l'utilisateur.  Donc, à  priori, je ne dois pas implémenter - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex.  Sauf erreur de ma part  :P



  • laudemalaudema Membre
    18:01 modifié #4

    dans 1279306681:

    Juste une chose : itemList est un NSMutableArray et le datasource de ma tableView.  Les modifications apportées dans le datasource sont apportées par la modification de l'AdressBook de MacOS dans lequel je vais chercher les infos, et pas par l'utilisateur.  Donc, à  priori, je ne dois pas implémenter - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex.  Sauf erreur de ma part  :P

    Jamais dit que tu avais à  le faire, pour l'affichage objectValue:forTableColumn:AtIndex: (je cite de mémoire) suffit.
    Celui là  l'utilises tu (avec son compère count) ?
    As tu bien déclaré ton protocole NSTableViewDataSource, dans la bonne classe et bien renseigné le tout dans IB ?
    Si oui sans warnings (alertes à  la compilation) ni pendant le runtime alors c'est déjà  plus bizarre.
  • sisopetronsisopetron Membre
    18:01 modifié #5
    Il y a un truc que je pige pas : si dans IB, j'ai bien relié le tableView à  un ArrayController qui lui même a son contenu lié à  itemList et que cela fonctionne, je veux dire que les données de itemList sont bien affichées dans le tableView, pourquoi donc si itemList est modifié par une action extérieure, ici la modification de l'address book, ne puis-je pas simplement répercuter les changements par un simple reloadData appliqué à  mon tableView. 

    Les bindings dans IB suffisent donc manifestement pour afficher mon array dans la table.  Je suis obligé ensuite de passer par du code (objectValue:forTableColumn:AtIndex:) pour mettre à  jour ma table ?  Un truc simple au départ devient beaucoup plus lourd tout à  coup !  :'(
  • laudemalaudema Membre
    18:01 modifié #6
    dans 1279366512:

    ne puis-je pas simplement répercuter les changements par un simple reloadData appliqué à  mon tableView. 

    Les bindings dans IB suffisent donc manifestement pour afficher mon array dans la table.  Je suis obligé ensuite de passer par du code (objectValue:forTableColumn:AtIndex:) pour mettre à  jour ma table ?  Un truc simple au départ devient beaucoup plus lourd tout à  coup !  :'(

    Du tout, si tu utilises les bindings et un arrayController tu n'as nul besoin autre que de faire savoir aux observateurs de ton tableau que celui ci a changé, relis ce que j'ai écris ça revient à  ça. Pour les bindings reloadData et les méthodes du datasource ne servent à  rien.
    Relis donc mon premier message et si ça ne marche pas revient :(
  • sisopetronsisopetron Membre
    18:01 modifié #7
    Tu as raison, je n'avais pas compris ton premier post.  La mise à  jour se fait automatiquement pour peu qu'on fasse ce que tu avais dit :  ;)

    Tu peux aussi l'encadrer avec des
    Code: [Sélectionner]
    [self willChangeValueForKey:@itemList];
    //...
    [self didChangeValueForKey:@itemList];


    Merci pour ton aide : problème résolu.
Connectez-vous ou Inscrivez-vous pour répondre.