Gérer une table sans se fatiguer à tout programmer

Commençons par créer les objets dans Interface Builder.

Dans une fenêtre, déposez un objet NSTableView pour la grille, des objets NSTextField pour les zones de saisie et NSButton pour les 2 boutons. C'est le BA-ba, je n'y reviens pas.

interface

Déposez ensuite un objet NSObjectController dans la fenêtre de votre fichier .NIB. Cet objet va faire le lien entre votre tableau et le contrôleur de votre application :

nsobjectcontroller

suite un objet NSArrayController dans la fenêtre de votre fichier .NIB. Cet objet va représenter votre tableau; vous pouvez lui donner le nom que vous voulez :

nscontrollerarray

Le reste du travail va essentiellement consister à raccorder tout ce petit monde.

Cliquez sur l'icône de l'objet NSObjectController et tout en maintenant la touche [Ctrl], glissez jusqu'à l'icône du contrôleur de votre application (le cube bleu). Relachez la souris et dans la fenêtre de connexion qui s'affiche, sélectionnez la ligne "Content" et cliquez sur le bouton "Connect".


connection

Sélectionnez l'icône de l'objet NSArrayController et affichez les propriétés. Déroulez le menu de la fenêtre et affichez "Bindings". Déroulez la section "contentArray" et renseignez les champs comme indiqué ci-dessous. "myTable" dans le champ "Model Key Path" est le nom de la variable d'instance de votre tableau dans le programme :

bindings

Affichez l'objet NSTableView et double-cliquez deux fois sur l'entête de la première colonne pour sélectionner l'objet NSTableColumn sous-jacent. Profitez-en pour nommer l'entête de ladite colonne. Affichez ensuite les propriétés de Binding de la colonne. Dans la section value, renseignez les champs comme indiqué ci-dessous. "NSArrayController" est le nom de votre objet NSArrayController; c'est ce nom qui apparaîtra dans le menu "Bind to" si vous l'avez renommé. "motcle" dans le champ "Model Key Path" est arbitraire, mais il détermine la structure du dictionnaire de données que votre programme va utiliser.

nstablecolumn

Faites de même avec l'autre colonne. Donnez une autre valeur dans le champ "Model Key Path".

Occupons-nous maintenant des 2 boutons.

Sélectionnez le bouton prévu pour ajouter des données. Tout en conservant l'appui sur le bouton [Ctrl], glissez jusqu'à l'icône de l'objet NSArrayController. Relâchez la souris et dans la fenêtre qui s'affiche, sélectionnez l'action "add" puis cliquez sur "Connect". Faites de même avec le bouton prévu pour supprimer des éléments, mais sélectionnez l'action "remove" :


connectaction_1

Votre application peut déjà fonctionner. Il faut juste ajouter la déclaration de votre tableau dans le header de votre classe contrôleur :

    NSMutableArray * myTable;


Compilez et testez. Admirez le résultat... et tout ça sans une seule ligne de code !!!!

Terminons avec le binding des contrôles NSTextField. Remarquez bien que ça n'a rien d'indispensable puisque vous pouvez éditer les données directement dans la grille.

Sélectionnez l'objet NSTextField ou NSFormCell et affichez ses propriétés de Bindings. Dans la section "value", renseignez les champs comme indiqué ci-dessous. "NSArrayController" est le nom de votre objet NSArrayController; c'est ce nom qui apparaîtra dans le menu "Bind to" si vous l'avez renommé. "motcle" dans le champ "Model Key Path" doit correspondre à ce que vous avez mis pour la colonne correspondante. En fait, ce paramétrage est identique à ce que vous avez fait pour la colonne sauf que "Controller Key" est "selection" au lieu de "arrangedObjects". Pour ne pas vous tromper, utilisez la liste déroulante :

nsformcell

Procédez de même avec l'autre zone de saisie, mais en prenant une autre valeur pour "Model Key Path".

Recompilez l'application et testez...

Remarquez que si vous avez activé la sélection multiple dans la grille, si vous tapez une nouvelle valeur dans le contrôle de saisie, elle remplacera toutes les valeurs de la colonne correspondante dans les lignes sélectionnées.

Cerise sur le gâteau : nous allons ajouter un texte qui affichera le nombre d'éléments dans la table.

Ajoutez un objet de type "Label Font Text" (c'est un NSTextField malgré tout, mais il n'est pas éditable). Affichez ses propriétés de Bindings et dans la section "displayPatternValue1", renseignez les champs comme suit. Remarquez le champ "Model Key Path" avec la valeur spéciale "@count". Remarquez également le champ "Display Pattern" qui formate la valeur affichée.


count

Vous pourriez également afficher le nombre d'éléments sélectionnés dans la liste (utile dans le cas où vous avez activé la sélection multiple). Remplacez simplement "arrangedObjects" dans le champ "Controller Key" par "selection".

Vous pouvez télécharger le projet complet sur ma
page de téléchargement (DemoBind.zip)