effectuer un calcul lors de l'affichage d'une fenêtre
sisopetron
Membre
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 :
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 !
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 !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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
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)
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
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.
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
Merci pour ton aide : problème résolu.