web-dev-qa-db-ja.com

簡単なKVOの例

簡単なKVOの例を実行しようとしていますが、問題があります。

これは私の* .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

注:クリックするとnumberプロパティが増加するボタンがあります。
numberプロパティが変更されたときに通知を受け取りたい。

コードが機能していないため、その理由がわかりません。

31
WebOrCode

KVOはセッターとゲッターで動作し、incNumberではiVarに直接アクセスしているので、代わりにself.number

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

のではなく:

_number++;

試してください:

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

またはもっと良いだけ:

self.number++

そして、システムにwillChangeValueForKey:およびdidChangeValueForKey:メソッド。

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

そして、私はこのクラスを使用している他のクラスで

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

//これは、値が変更されるかどうかを処理するデリゲートメソッドです

-(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