Значение ключа iOS, наблюдающее за проблемами проекта Xcode
Сейчас я изучаю наблюдение значения ключа, у очень простого проекта KVO есть небольшие проблемы, которые не выводят свойства, новые значения изменяются, когда observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
метод называется. Это очень странно, надеюсь, кто-нибудь поможет мне найти, где возникли проблемы, я очень ценю это!
Вот мой исходный код:
ViewController.h
#import <UIKit/UIKit.h>
@class Person;
@interface ViewController : UIViewController
@property (nonatomic, strong) Person *person;
@end
ViewController.m
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize person;
- (void)viewDidLoad
{
[super viewDidLoad];
self.person = [[Person alloc] init];
[self changeName];
[self.person addObserver:self
forKeyPath:@"fullName"
options:NSKeyValueObservingOptionNew
context:NULL];
}
- (void)changeName
{
self.person.fullName = @"Andy";
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([keyPath isEqualToString:@"fullName"])
{
NSLog(@"%@", change);
NSString *string = [change objectForKey:NSKeyValueChangeNewKey];
NSLog(@"%@", string);
}
}
- (void)dealloc
{
[self.person removeObserver:self forKeyPath:@"fullName"];
}
@end
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, strong) NSString *fullName;
@end
Person.m
#import "Person.h"
@implementation Person
@synthesize fullName = _fullName;
@end
2 ответа
Решение
Вы меняете имя, прежде чем добавить наблюдателя. Поменяйте местами это:
[self changeName];
[self.person addObserver:self
forKeyPath:@"fullName"
options:NSKeyValueObservingOptionNew
context:NULL];
...за это:
[self.person addObserver:self
forKeyPath:@"fullName"
options:NSKeyValueObservingOptionNew
context:NULL];
[self changeName];
Посмотрите порядок ваших звонков,
Ты звонишь changeName
прежде чем вы зарегистрируетесь в качестве наблюдателя.
Переместить changeName
позвоните ниже addObserver
метод и посмотрим, что произойдет.