2011-04-11 3 views

Répondre

22

Vous observez les clés pour être averti lorsque leur valeur change. Le type de données peut être n'importe quoi. Pour tout ce qui est défini comme une propriété Objective-C (avec @property dans le fichier .h), si vous souhaitez observer une propriété BOOL que vous ajoutez à un contrôleur de vue, procédez comme suit:

dans myViewController.h:

@interface myViewController : UIViewController { 
    BOOL  mySetting; 
} 

@property (nonatomic) BOOL mySetting; 

dans myViewController.m

@implementation myViewController 

@synthesize mySetting; 

// rest of myViewController implementation 

@end 

dans otherViewController.m:

// assumes myVC is a defined property of otherViewController 

- (void)presentMyViewController { 
    self.myVC = [[[MyViewController alloc] init] autorelease]; 
    // note: remove self as an observer before myVC is released/dealloced 
    [self.myVC addObserver:self forKeyPath:@"mySetting" options:0 context:nil]; 
    // present myVC modally or with navigation controller here 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if (object == self.myVC && [keyPath isEqualToString:@"mySetting"]) { 
     NSLog(@"OtherVC: The value of self.myVC.mySetting has changed"); 
    } 
} 
+0

dans myViewController [self setMySetting: YES]; mettre à jour – mconnors

-1

S'il s'agit de propriétés d'objets, alors oui.

Si elles ne sont pas des propriétés, alors non.

+0

Rien, je ne sais tout simplement pas comment l'utiliser pour chercher un changement dans la valeur de la variable. – Andrei

+0

Corrigez-moi si je me trompe, mais afaik il ne doit pas être une propriété, il peut être 2 méthodes un getter - [boolName] et un setter - set [boolName] qui prendra et renverra un NSNumber –

+0

I ' m fait référence aux variables BOOL d'édition de UIViewControllers. Donc, d'une certaine manière, ce sont des propriétés, mais pas des objets que j'ai faits. – Andrei

1

Oui; la seule exigence est que l'objet dans lequel ces variables se produisent soit conforme à la valeur-clé pour ces propriétés.

5

Je crois que vous vouliez dire: Comment obtenir la valeur INT ou BOOL du dictionnaire 'change' si la propriété a changé.

Vous pouvez simplement le faire de cette façon:

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"mySetting"]) 
    { 
     NSNumber *mySettingNum = [change objectForKey:NSKeyValueChangeNewKey]; 
     BOOL newSetting = [mySettingNum boolValue]; 
     NSLog(@"mySetting is %s", (newSetting ? "true" : "false")); 
     return; 
    } 

    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
} 
+0

Existe-t-il une raison spécifique pour laquelle vous reviendriez si vous manipuliez votre variable et n'appeliez pas la super méthode? De cette façon, la super méthode n'est appelée que lorsque KVO est appelée et ce n'est pas votre variable. – Leon

Questions connexes