Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add Observer to BOOL variable

Is it possible to add observers to simple variables such as BOOLs or NSIntegers and see when they change?

Thanks!

like image 797
Alex Avatar asked Apr 11 '11 15:04

Alex


2 Answers

You observe keys to be notified when their value changes. The data type can be anything. For anything defined as an Objective-C property (with @property in the .h file) this is ready to go so if you want to observe a BOOL property you add to a view controller you do it as follows:

in myViewController.h:

@interface myViewController : UIViewController {
    BOOL      mySetting;
}

@property (nonatomic)    BOOL    mySetting;

in myViewController.m

@implementation myViewController

@synthesize mySetting;

// rest of myViewController implementation

@end

in 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");
    }
}
like image 135
XJones Avatar answered Oct 05 '22 04:10

XJones


I believe what you meant was: How to get INT or BOOL value from the 'change' dictionary if the property has changed.

You can simply do it this way:

- (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];
}
like image 44
Kuba S. Avatar answered Oct 05 '22 05:10

Kuba S.