2014-07-26 21 views
26

Basit KVO örneği yapmaya çalışıyorum, ancak sorun yaşıyorum.Basit KVO örneği

Bu benim * .m dosyasıdır:

#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 

Not: Ben tıklandığında o number özelliğini artırır bir düğme vardır.
number özelliği değiştiğinde haberdar olmak istiyorum.

Kod çalışmıyor ve nedenini anlayamıyorum.

cevap

20

KVO hazırlayıcısı ve gaz giderici ile çalışır ve incNumber içinde doğrudan daha self.number

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

'self.number kullanıyorum – WebOrCode

+0

evet, aynı zamanda işe yarayacak. – codester

+1

KVO hakkındaki tüm okumalarımda, kimse bunu bulana kadar özellikleri ayarlamanız gerektiğini söylemekten rahatsız olmadı. Teşekkürler. – inorganik

9

Aksine o kullanımının böylece yerine Ivar eriştiğini:

_number++; 

Dene:

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

veya daha da iyisi:

self.number++ 

Sistemin willChangeValueForKey: ve didChangeValueForKey: yöntemlerini kullanmasına izin verin. ben bu

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

bu değerin özen temsilci yöntemi değiştirilir edilir // sınıfı ya da değil

-(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"]]; 
    } 
} 
+4

Nesne aynı sınıfta değilse. Bir singleton sınıfındaki bir nesnesi. KVO nasıl uygulanır. – Nishant

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 

ve diğer sınıfta

++ `de çalışıyor. 10 dakika içinde cevabınızı kabul edeceğim.