Simple KVO example
30,140
Solution 1
KVO works with setter and getter and in incNumber
you are directly accessing iVar so instead of that use self.number
- (IBAction)incNumber:(id)sender
{
self.number++;
NSLog(@"%d", self.number);
}
Solution 2
Rather than:
_number++;
Try:
[self willChangeValueForKey:@"number"];
_number++;
[self didChangeValueForKey:@"number"];
or ever better just:
self.number++
And let the system take care of the willChangeValueForKey:
and didChangeValueForKey:
methods.
Solution 3
@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
and in other class where i am using this class
TraineeLocationCell *locationView;//create object here
[locationView addObserver:self forKeyPath:@"traineeAddress" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];//observing the key in this class
//this is the delegate method which take care of value is changed or not
-(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"]];
}
}
Comments
-
WebOrCode about 4 years
I am trying to do simple KVO example, but I am having problems.
This is my *.m file:
#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
Note: I have a button which when clicked it will increment the
number
property.
I want to be notified whennumber
property is changed.The code is not working and I can not figure it why.
-
WebOrCode almost 10 years
self.number++
is also working. In 10 minutes I will accept your answer. -
Nishant over 9 yearswhat if the object is not in the same class. Its an object in a singleton class. How to apply KVO on that.
-
inorganik over 9 yearsIn all my reading about KVO, nobody has bothered to mention that you need to set properties this way until I found this. Thanks.
-
mfaani about 8 yearsyou mean unlike custom
init
&dealloc
methods where you shouldn't use self.property...here you actually should useself.property
?