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

Este es mi *.m de archivo:

#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 se incrementará el number propiedad.

Quiero ser notificado cuando number propiedad se cambia.

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

InformationsquelleAutor WebOrCode | 2014-07-26

3 Comentarios

  1. 25

    KVO trabaja con setter y getter y en incNumber usted está accediendo directamente iVar así que en lugar de que el uso self.number

    - (IBAction)incNumber:(id)sender
    {
        self.number++;
        NSLog(@"%d", self.number);
    }
    • self.number++ también está trabajando. En 10 minutos voy a aceptar su respuesta.
    • En todas mis lecturas acerca de KVO, nadie se ha molestado en mencionar que usted necesita para establecer las propiedades de esta forma hasta que encontré esto. Gracias.
    • te refieres a diferencia de la costumbre init & dealloc métodos donde se no el uso de auto.la propiedad…aquí en realidad debe usar self.property?
  2. 9

    Lugar de:

    _number++;

    Tratar:

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

    o nunca mejor:

    self.number++

    Y dejar que el sistema de atención de la willChangeValueForKey: y didChangeValueForKey: métodos.

    • ¿y si el objeto no está en la misma clase. Su objeto en una clase singleton. Cómo aplicar KVO en que.
  3. 2
    @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 otros de la clase donde yo 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 delegado que tener cuidado de valor es cambiado 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"]];
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here