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)
而不是:
_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:方法.
| 归档时间: |
|
| 查看次数: |
27552 次 |
| 最近记录: |