Значение ключа 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 метод и посмотрим, что произойдет.

Другие вопросы по тегам