2009-11-02 7 views
0

J'ai un objet lié à l'interface utilisateur avec un NSObjectController. Je suis capable d'archiver l'objet et de le désarchiver plus tard. Cela fonctionne bien jusqu'à présent. Dans le débogueur, je peux voir que l'objet contient les données que j'ai sauvegardées lors d'une session précédente. Le problème restant est: L'interface utilisateur ne s'actualise pas. Je suppose que je dois dire au NSObjectController qu'il doit faire face à un autre objet. Mais je ne sais pas comment. J'ai essayé newObject mais cela n'a pas fonctionné du tout.Cocoa: Actualiser NSObjectController après désarchiver les données du disque

Au moment mon code ressemble à ceci:

if ([aOpenPanel runModal] == NSOKButton) 
{ 
    NSString *filename = [aOpenPanel filename]; 
    rpgCharacter = [NSKeyedUnarchiver unarchiveObjectWithFile:filename]; 

    // [myCharacterController DoSomething] ??? 
} 

rpgCharacter devrait être l'objet pour la myCharacterController.

Répondre

1

Ce que vous faites est de régler directement le rpgCharacter iVar. Pour déclencher KVO vous devez faire cela d'une manière différente, soit:

si vous utilisez Objective-C 2.0 et la syntaxe de la propriété:

if ([aOpenPanel runModal] == NSOKButton) 
{ 
    NSString *filename = [aOpenPanel filename]; 
    self.rpgCharacter = [NSKeyedUnarchiver unarchiveObjectWithFile:filename]; 

} 

ou, si vous utilisez directement KVC et un correctement nommé setter:

if ([aOpenPanel runModal] == NSOKButton) 
{ 
    NSString *filename = [aOpenPanel filename]; 
    [self setRpgCharacter:[NSKeyedUnarchiver unarchiveObjectWithFile:filename]]; 

} 
+0

Fonctionne bien. Merci. Donc j'ai besoin de définir l'objet via une propriété ou une méthode accesseur pour déclencher le KVO? Oui, fait parfaitement sens pour moi maintenant. – TalkingCode

+0

Oui. Sauf pour les méthodes d'initialisation où elles doivent être définies directement http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/ObjectiveC/Articles/ocAllocInit.html#//apple_ref/doc/uid/TP30001163-CH22- SW1 – Abizern