J'essaie de faire un exemple simple du KVO, mais j'ai des problèmes.
Voici mon fichier * .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
Remarque: J'ai un bouton qui, lorsqu'il est cliqué, incrémentera la propriété number
.
Je souhaite être averti lorsque la propriété number
est modifiée.
Le code ne fonctionne pas et je ne peux pas comprendre pourquoi.
KVO fonctionne avec setter et getter et dans incNumber
vous accédez directement à iVar donc au lieu d'utiliser self.number
- (IBAction)incNumber:(id)sender
{
self.number++;
NSLog(@"%d", self.number);
}
Plutôt que:
_number++;
Essayer:
[self willChangeValueForKey:@"number"];
_number++;
[self didChangeValueForKey:@"number"];
ou mieux encore:
self.number++
Et laissez le système s'occuper de willChangeValueForKey:
et didChangeValueForKey:
méthodes.
@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
et dans une autre classe où j'utilise cette classe
TraineeLocationCell *locationView;//create object here
[locationView addObserver:self forKeyPath:@"traineeAddress" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];//observing the key in this class
// c'est la méthode déléguée qui prend soin de la valeur est modifiée ou non
-(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"]];
}
}