ios objective-c key-value-observing

ios - Ejemplo de KVO simple



objective-c key-value-observing (3)

KVO trabaja con setter y getter y en incNumber está accediendo directamente a iVar, por lo que en lugar de eso, use self.number

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

Estoy tratando de hacer un ejemplo simple de KVO, pero estoy teniendo problemas.

Este es mi archivo * .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

Nota: Tengo un botón que al hacer clic incrementará la propiedad del number .
Quiero ser notificado cuando se cambie la propiedad del number .

El código no funciona y no puedo entender por qué.


Más bien que:

_number++;

Tratar:

[self willChangeValueForKey:@"number"]; _number++; [self didChangeValueForKey:@"number"];

o cada vez mejor solo

self.number++

Y deje que el sistema se ocupe de los willChangeValueForKey: y didChangeValueForKey:


@interface TraineeLocationCell : UIView @property (strong, nonatomic) NSString *traineeAddress; @end @implementation // in textview delgate method i am setting traineeAddress string value - (void)textViewDidEndEditing:(UITextView *)textView { if (textView.text.length >0) [self setValue:textView.text forKey:@"traineeAddress"]; } @end

y en otra clase donde estoy usando esta clase

TraineeLocationCell *locationView;//create object here [locationView addObserver:self forKeyPath:@"traineeAddress" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];//observing the key in this class

// este es el método de delegado que cuida el valor se cambia o no

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if([keyPath isEqualToString:@"traineeAddress"]){ if (!settingsValues.address) settingsValues.address = [[NSMutableArray alloc]initWithObjects:[change valueForKey:@"new"], nil]; else [settingsValues.address replaceObjectAtIndex:0 withObject:[change valueForKey:@"new"]]; } }