NSCoding et Outlets
Mick
Membre
Bonjour à tous,
Je me prends un peu la tête avec ces histoires de NSCoding... J'ai une document-based application. J'ai implémenté initWithCoder et encodeWithCoder dans ma subclass de MyDocument. Les variables d'instances de MyDocument sont bien initialisées sans soucis... Sauf que, j'ai différents controleurs, instances de sous-classes NSObject, qui sont instanciés via interface builder. J'ai donc des outlets dans MyDocument qui pointent vers ces controleurs. J'aimerais initialiser correctement les variables d'instances de ces controleurs lors de l'ouverture d'un fichier. Pour cela, j'ai implémenté initWithCoder et encodeWithCoder pour toutes les classes concernées.
Au debug, le controleur est bien initialisé, puis juste après il est désalloué... Le problème vient a priori du fait que lorsque je désarchive mon fichier, tout est bien initialisé... Mais, une fois cela fait, le fichier NIB est désarchivé, et de ce fait, des nouvelles instances toutes fraà®ches sont allouées et initialisées "à zéro" ...
Comment faire donc pour initialiser les variables d'instances d'objets créés dans IB ?
Si ce n'est pas possible, comment puis-je faire pour "connecter" les outlets si j'instancie via le code ? Faut-il que j'en déduise que MyDocument doit contenir TOUS les outlets ?
Voici un bout de code : ici le controleur de graphes, qui est instancié via IB
Le bout de code de MyDocument :
Je me prends un peu la tête avec ces histoires de NSCoding... J'ai une document-based application. J'ai implémenté initWithCoder et encodeWithCoder dans ma subclass de MyDocument. Les variables d'instances de MyDocument sont bien initialisées sans soucis... Sauf que, j'ai différents controleurs, instances de sous-classes NSObject, qui sont instanciés via interface builder. J'ai donc des outlets dans MyDocument qui pointent vers ces controleurs. J'aimerais initialiser correctement les variables d'instances de ces controleurs lors de l'ouverture d'un fichier. Pour cela, j'ai implémenté initWithCoder et encodeWithCoder pour toutes les classes concernées.
Au debug, le controleur est bien initialisé, puis juste après il est désalloué... Le problème vient a priori du fait que lorsque je désarchive mon fichier, tout est bien initialisé... Mais, une fois cela fait, le fichier NIB est désarchivé, et de ce fait, des nouvelles instances toutes fraà®ches sont allouées et initialisées "à zéro" ...
Comment faire donc pour initialiser les variables d'instances d'objets créés dans IB ?
Si ce n'est pas possible, comment puis-je faire pour "connecter" les outlets si j'instancie via le code ? Faut-il que j'en déduise que MyDocument doit contenir TOUS les outlets ?
Voici un bout de code : ici le controleur de graphes, qui est instancié via IB
<br />@implementation ControleurGraphes<br />- (void)encodeWithCoder:(NSCoder *)leCodeur {<br /> [leCodeur encodeObject:parametresAxes forKey:@"parametresAxes"];<br /> [leCodeur encodeObject:tangentes forKey:@"tangentes"];<br /> [leCodeur encodeObject:xAxis forKey:@"xAxis"];<br /> [leCodeur encodeObject:reticule forKey:@"reticule"];<br />}<br />- (id)initWithCoder:(NSCoder *)leCodeur {<br /> self=[super init];<br /> parametresAxes=[[leCodeur decodeObjectForKey:@"parametresAxes"] retain];<br /> tangentes=[[leCodeur decodeObjectForKey:@"tangentes"] retain];<br /> reticule=[[NSMutableDictionary dictionaryWithObjectsAndKeys:<br /> [NSNumber numberWithBool:NO],@"hasFirstPoint",<br /> [NSNumber numberWithBool:NO],@"hasSecondPoint",nil] retain];<br /> leMode=selection;<br /> xAxis=[leCodeur decodeObjectForKey:@"xAxis"];<br /> return self;<br />}<br />
Le bout de code de MyDocument :
<br />- (id)initWithCoder:(NSCoder *)leCodeur {<br /> self=[super init];<br /> lesFlags=[[leCodeur decodeObjectForKey:@"lesFlags"] retain];<br /> lesPointsDeReglages=[[leCodeur decodeObjectForKey:@"lesPointsDeReglages"] retain];<br /> listeDesVars=[[leCodeur decodeObjectForKey:@"listeDesVars"] retain];<br /> listeDerivatedVars=[[leCodeur decodeObjectForKey:@"listeDerivatedVars"] retain];<br /> newID=[leCodeur decodeIntForKey:@"newID"];<br /> lesDonnees=[[leCodeur decodeObjectForKey:@"lesDonnees"] retain];<br /> lesGraphes=[[leCodeur decodeObjectForKey:@"lesGraphes"] retain];<br /> urlFilmOuImage=[[leCodeur decodeObjectForKey:@"urlFilmOuImage"] retain];<br /> leControleurGraphes=[leCodeur decodeObjectForKey:@"leControleurGraphes"];<br /> return self;<br />}<br />- (void)encodeWithCoder:(NSCoder *)leCodeur {<br /> [leCodeur encodeObject:leControleurGraphes forKey:@"leControleurGraphes"];<br /> [leCodeur encodeObject:lesFlags forKey:@"lesFlags"];<br /> [leCodeur encodeObject:lesPointsDeReglages forKey:@"lesPointsDeReglages"];<br /> [leCodeur encodeObject:listeDesVars forKey:@"listeDesVars"];<br /> [leCodeur encodeObject:listeDerivatedVars forKey:@"listeDerivatedVars"];<br /> [leCodeur encodeInt:newID forKey:@"newID"];<br /> [leCodeur encodeObject:lesDonnees forKey:@"lesDonnees"];<br /> [leCodeur encodeObject:lesGraphes forKey:@"lesGraphes"];<br /> [leCodeur encodeObject:urlFilmOuImage forKey:@"urlFilmOuImage"];<br />}<br />- (id)initWithContentsOfURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError {<br /> self=[NSKeyedUnarchiver unarchiveObjectWithFile:[absoluteURL path]];<br /> return self;<br />}<br />
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
éveil des objets du nib
Je ne vois pas comment procéder. En effet, la méthode initWithCoder: est appelée avant awakeFromNib. Je n'ai accès au coder que dans cette méthode pour décoder les objets.... je ne comprends pas la logique de cette histoire de coder !! Lors de l'ouverture du fichier, la méthode readFromURL, ou dataOfType ... est appelée : c'est bien dans cette méthode qu'il faut appeler [NSKeyedUnarchiver unarchiveObjectWithFile:] ? Après cela, les méthodes initWithCoder sont appelées pour chaque objet du graph, et ensuite awakeFromNib... qui écrase tout pour les objets qui sont instanciés dans IB !!
Comment désarchiver les objets dans awakeFromNib ?
Ca m'apprendra !
Merci pour vos réponses en tout cas. Voici les bouts de codes. Si vous voyez des horreurs, dites-le moi !