Добавить Observer в переменную BOOL - PullRequest
9 голосов
/ 11 апреля 2011

Можно ли добавить наблюдателей к простым переменным, таким как BOOL или NSIntegers, и посмотреть, когда они изменятся?

Спасибо!

Ответы [ 4 ]

22 голосов
/ 11 апреля 2011

Вы наблюдаете, что ключи будут уведомлены, когда их значение изменится.Тип данных может быть любым.Для всего, что определено как свойство Objective C (с @property в .h файле), все готово, поэтому, если вы хотите наблюдать свойство BOOL, добавляемое в контроллер представления, вы делаете это следующим образом:

в myViewController.h:

@interface myViewController : UIViewController {
    BOOL      mySetting;
}

@property (nonatomic)    BOOL    mySetting;

в myViewController.m

@implementation myViewController

@synthesize mySetting;

// rest of myViewController implementation

@end

в 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");
    }
}
5 голосов
/ 05 февраля 2014

Я думаю, что вы имели в виду: как получить значение INT или BOOL из словаря 'change', если свойство изменилось.

Вы можете просто сделать это так:

- (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];
}
1 голос
/ 11 апреля 2011

Да; единственное требование состоит в том, чтобы объект, в котором встречаются эти переменные, соответствовал значению ключа для этих свойств.

0 голосов
/ 11 апреля 2011

Если они являются свойствами объектов, тогда да.

Если они не являются свойствами, то нет.

...