简单的KVO例子

Web*_*ode 34 objective-c key-value-observing ios

我想做一个简单的KVO例子,但我遇到了问题.

这是我的*.m文件:

#import "KVO_ViewController.h"

@interface KVO_ViewController ()

@property NSUInteger number;

@end

@implementation KVO_ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self addObserver:self forKeyPath:@"number" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)incNumber:(id)sender
{
    _number++;
    NSLog(@"%d", _number);
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"From KVO");

    if([keyPath isEqualToString:@"number"])
    {
        id oldC = [change objectForKey:NSKeyValueChangeOldKey];
        id newC = [change objectForKey:NSKeyValueChangeNewKey];

        NSLog(@"%@ %@", oldC, newC);
    }
}

@end
Run Code Online (Sandbox Code Playgroud)

注意:我有一个按钮,点击它会增加number属性.
我想在number财产变更时收到通知.

代码不起作用,我无法理解为什么.

cod*_*ter 25

KVO与setter和getter配合使用,并且incNumber您直接访问iVar,而不是使用它self.number

- (IBAction)incNumber:(id)sender
{
    self.number++;
    NSLog(@"%d", self.number);
}
Run Code Online (Sandbox Code Playgroud)

  • 在我关于KVO的所有阅读中,没有人提到你需要这样设置属性,直到我找到它为止.谢谢. (2认同)

Abi*_*ern 9

而不是:

_number++;
Run Code Online (Sandbox Code Playgroud)

尝试:

[self willChangeValueForKey:@"number"];
_number++;
[self didChangeValueForKey:@"number"];
Run Code Online (Sandbox Code Playgroud)

或者更好的只是:

self.number++
Run Code Online (Sandbox Code Playgroud)

让系统处理willChangeValueForKey:didChangeValueForKey:方法.

  • 如果对象不在同一个类中该怎么办?它是单例类中的对象.如何申请KVO. (4认同)