将KVO通知添加到同一对象的属性

时间:2014-05-27 09:43:43

标签: objective-c ios7 key-value-observing

我想将KVO通知添加到控制器的某个属性中,这样只要该属性发生更改,就会在同一个控制器中调用 observeValueForKeyPath 方法。这就是我想要的做:

@interface ViewController ()

@property(strong, nonatomic)NSString *currentState;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    _currentState = @"Active";
    [self addObserver:self forKeyPath:@"currentState" options:NSKeyValueObservingOptionNew context:NULL];
}


-(IBAction)changeState:(UIButton *)sender{
    if([_currentState isEqualToString:@"Active"])
        _currentState = @"Inactive";
    else
        _currentState = @"Active";
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if([keyPath isEqualToString: @"currentState"]) {
        NSLog(@"State Changed : %@",_currentState);
    }

但是这个方法在按钮点击时根本没有调用observeValueForKeyPath。我在其上搜索了更多的例子,但是他们都使用了两个不同类的对象来演示它。 我的问题是:

  1. 可以按照我尝试的方式使用KVO通知,即在同一个对象上使用吗?
  2. 如果是,那么上面代码的问题是什么?
  3. 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

由于您直接修改了实例变量,因此未触发通知, 而不是使用属性访问器方法:

-(IBAction)changeState:(UIButton *)sender{
    if([self.currentState isEqualToString:@"Active"])
        self.currentState = @"Inactive";
    else
        self.currentState = @"Active";
}