web-dev-qa-db-fra.com

Exemple KVO simple

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.

31
WebOrCode

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);
}
24
codester

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.

9
Abizern
@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"]];
    }
}
2
parvind