10

是否可以将观察者添加到简单的变量(例如 BOOL 或 NSInteger)并查看它们何时发生变化?

谢谢!

4

4 回答 4

22

您观察键在其值更改时收到通知。数据类型可以是任何东西。对于任何定义为 Objective-C 属性(在 .h 文件中带有 @property)的东西,这已准备就绪,因此如果您想观察添加到视图控制器的 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");
    }
}
于 2011-04-11T18:29:50.290 回答
5

我相信您的意思是:如果属性已更改,如何从“更改”字典中获取 INT 或 BOOL 值。

你可以简单地这样做:

- (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];
}
于 2014-02-04T23:21:06.403 回答
1

是的; 唯一的要求是出现这些变量的对象对于这些属性是键值兼容的。

于 2011-04-11T15:58:37.253 回答
-2

如果它们是对象的属性,那么是的。

如果它们不是属性,那么没有。

于 2011-04-11T15:58:18.213 回答