Pourquoi à la création
Bloc de code:
[NSDictionary dictionaryWithObjectsAndKeys:
@"NomVar",@"nom",@"UnitVar",@"Unit",nil]
le résultat est le même dictionnaire après 2 créations successives ? Pourquoi n'est-ce plus le cas si je change le nom de la variable avant de créer la 2ème ?
C'est une astuce de Cocoa pour économiser de la mémoire. Un NSDictionary n'étant pas modifiable, si deux dictionnaires contiennent exactement les mêmes clés et les mêmes valeurs, alors il est inutile de réserver de la mémoire pour le second: il suffit d'envoyer un -[retain] au premier dictionnaire et de renvoyer le même pointeur.
À mon avis, les dictionnaires ne répondent pas à trop à ton besoin. Voici comment je ferais.
Les données doivent faire partie du document pour te permettre d'enregistrer et de charger les données.
Bloc de code:
@interface MyDocument: NSDocument
{
NSMutableArray* variables; // Liste de MIVariables
}
@end
N'oublie pas de créer le NSMutableArray dans la méthode d'init du document.
Bloc de code:
@interface MIVariable: NSObject
{
NSString* nom;
NSString* unite;
NSMutableArray* mesures; // Liste de MIMesures
}
@end
Une Variable a un nom et une unité, et une liste de Mesures.
N'oublie pas de créer le NSMutableArray dans la méthode d'init de MIVariable.
Bloc de code:
@interface MIMesure: NSObject
{
double temps;
double valeur;
}
@end
Ensuite MyDocument.xib va comporter deux NSArrayController.
Le premier, "Variables" a son Content Array bindé sur [File's Owner].document.variables
Le second, "Mesures" a son Content Array bindé sur [Variables].[selection].mesures
=> Il contient donc la liste des mesures de la Variable actuellement sélectionnée dans le NSArrayController "Variables".
La première NSTableView présente les Variables.
Sa première colonne est bindée sur [Variables].nom
La seconde sur [Variables].unite.
La seconde NSTableView présente les Mesures.
Sa première colonne est bindée sur [Mesures].temps
La seconde sur [Mesures].valeur.
Je conçois que ceci ne répond pas totalement à ta vision, puisque les mesures sont affichées en lignes, et uniquement pour la variable actuelle, mais c'est beaucoup plus simple !
On pourrait envisager d'avoir une seule table avec des colonnes
temps | var1 | var2 | var3 | var4
Mais c'est plus compliqué, et implique que ce soit la Mesure qui contienne une liste de Variables. La NSTableView est conçue pour lister son contenu verticalement.
Pour l'enregistrement, le plus simple est d'utiliser les classes NSKeyArchiver/Unarchiver.
Je te conseille la lecture de l'incontournable Programmation Cocoa sous Mac OS X qui en cause largement.