# afficher contenu NSArray window



## yachiro (23 Août 2011)

Bonjour à tous,

Voila j'ai une application MAC cocoa qui vient lire/parser le contenu d'un fichier texte et stocke les champs utiles dans un NSMutableArray.

Je souhaite dans un premier temps, afficher une fenêtre avec le contenu de ce tableau (dans un tableview ou autre ca n'a pas trop d'importance pour le moment).

Pour le moment, j'avais défini un label dans lequel j'affichais un des champs du tableau, l'ennui c'est que le tableau n'est pas fixe (le fichier dans lequel je lis les infos va varier selon tel ou tel paramètre donc impossible de prédéfinir n labels) donc les infos viennent s'écraser une à une sur le label et je ne récupère que la dernière si vous m'avez bien compris.

Donc j'aimerais si possible recueillir des idées sur comment procéder.

Merci à tous


----------



## Nyx0uf (23 Août 2011)

Google : NSTableView


----------



## yachiro (26 Août 2011)

Apres m'etre documenté j'arrive à faire ce que je veux dans une petite application developpée à coté en utilisant un NSArrayController.

Cependant, dans le cadre de mon projet, j'ai un Controller générique qui gère toute l'interface graphique et le but pour moi est qu'à partir de ce controller, j'appuie sur un bouton qui m'ouvre une fenêtre m'affichant ma TableView.
Quand j'essaye de faire les bindings comme avec un NSArrayController ca ne marche pas notamment pour le controller Key (arrangedObject n'existe pas). j'ai même droit à une erreur "this class is not key value coding-compliant for the key Name".

Donc j'ai 2 possibilités, est il possible à partir de mon premier controller de "passer la main" a un NSArrayController lors de l'appui du bouton afin que ce dernier génère la fenêtre possédant la tableview? Si oui de quelle manière.
Ou, est il possible de paramétrer mon controller principal de la même manière que le NSArrayController et d'utiliser les propriétés de ce dernier? Si oui de quelle manière car il semblerait dans ce cas que je m'y prends mal.

J'espère avoir été assez clair dans le cas contraire n'hésitez pas à me le faire savoir

Merci


----------



## Céroce (26 Août 2011)

yachiro a dit:


> Cependant, dans le cadre de mon projet, j'ai un Controller générique qui gère toute l'interface graphique


C'est mal. Comme toujours en POO, il faut trouver un équilibre entre le nombre d'objets et leur complexité.
Un contrôleur par ensemble de vue est ce qui est habituellement recommandé.



yachiro a dit:


> Quand j'essaye de faire les bindings comme avec un NSArrayController ca ne marche pas


C'est normal. La philo derrière les Bindings est que les contrôleurs font finalement souvent le même boulot pour synchroniser le modèle et les vues, donc on fournit des contrôleurs génériques (NSObjectController et ses héritiers). Leur fonctionnement est plein de subtilités.
Les bindings ont quelque chose de magique: on donne des noms de clés, on coche quelques cases et ça marche. Mais en pratique, sans une connaissance approfondie du Key-Value Coding et du Key-Value Observing, ça marche _par chance_, et on s'enfonce dans des problèmes vites insurmontables.

Ce qui m'amène à te conseiller la bonne vieille méthode des "data source". En gros, NSTableView possède un pointeur _dataSource_ qui est un objet répondant au protocole NSTableViewDataSource, qui définit certaines méthodes permettant de remplir la table. Par ex., ces méthodes renvoient le nombre de lignes et colonnes ou les données à afficher dans telle cellule. En général, la datasource sera le contrôleur qui gère la NSTableView. Il suffit donc de faire pointer dataSource vers File's Owner, et de le rendre conforme au protocole en y implémentant les quelques méthodes exigées.
Je te laisse regarder la doc, c'est moins difficile qu'il ne paraît.


----------



## yachiro (26 Août 2011)

Donc il n'y a aucun moyen de lier un controller avec un NSArrayController? parce que je sais afficher ce que je veux dans mon NSArrayController, j'ai juste besoin d'un "lien" entre les 2 !


----------



## Céroce (29 Août 2011)

Un NSArrayController se binde avec un NSMutableArray (clé contentArray).
Le NSMutableArray peut être maintenu par n'importe quel objet*, mais cet objet doit:
1/ Etre conforme au Key-Value Coding (variable d'instance _nom_ ou méthodes _setNom_: et _nom_: )
2/ Emettre les notifications Key-Value Coding willChangeValueForKey: didChangeValueForKey:.

On en revient à mon message précédent: si tu ne maîtrises pas le KVC et KVO, laisse béton.


* mais le binder avec un contrôleur témoigne d'une mauvaise conception, les contrôleurs devant être bindés à des Modèles.


----------



## yachiro (30 Août 2011)

Bon j'ai géré l'affaire comme j'ai pu maintenant j'aurais besoin de savoir si c'est possible d'afficher dans une des colonnes de ma tableview un lien hypertext vers une page web et si oui comment procéder?? 

Merci bien


----------



## Céroce (30 Août 2011)

On peut, mais pas simplement (il faut sous-classer NSTableCell, et en plus tu peux oublier les bindings).
Une solution simple peut être d'avoir un bouton "Voir la page" qui s'applique à la ligne sélectionnée.
L'action du bouton récupérerait le n° de la ligne sélectionnée, puis l'objet qui correspond à cette ligne.
Ensuite, ouvre la page avec [NSWorkspace openURL:].


----------



## yachiro (5 Septembre 2011)

Merci pour la réponse je vais essayer cela !


----------



## yachiro (9 Septembre 2011)

Bon alors j'ai procédé un peu d'une autre manière j'ai mis à coté de ma tableview un textview dans lequel j'affiche les hyperlinks correspondant et ca marche très bien.
Maintenant le seul ennui que j'ai c'est que quand je ferme la fenêtre contenant la tableview, et que je la réouvre j'obtiens une tableview affichant les données précédentes et les nouvelles (même si elles sont identiques).
J'aimerais que lorsque je ferme la fenêtre de la tableview, l'ensemble des données affichant dedans soient supprimées.

merci encore pour votre aide


----------

