从 IB 工作的绑定,而不是从我的 addObserver ...

Bindings working from IB, not from my addObserver...

我的基于文档的应用程序是在 Xcode 6.3 中创建的,没有故事板,所以它开始时没有 window 控制器(我仍然没有 window 控制器 - 只是试图提供一些背景和上下文)。

我实现了一个 class 结构,用于处理渐变并将其形成值存储在我的文档中。

我的文档 class 包含对主题对象的引用。

我的主题 class 持有对渐变对象的引用。

我的渐变 class 包含对渐变起点的 NSNumber 的引用。

在 IB 中,NSSlider 绑定到文件所有者,模型密钥路径为 "self.theme.gradient.startPointX" 这工作正常,正如 Gradient.m -didChangeValueForKey 注销其值正在更改的特定键所证明的那样。

那么,当我要求观察渐变起点的滑块发生变化时,为什么我的文档 class 中没有出现类似的通知?

Document.m

- (instanceType)init {
    self = [super init];
    if (self) {
        self.theme = [[MyTheme alloc] init];
        // first attempt -- not live when second attempt is compiling
        [self addObserver:self
               forKeyPath:@"theme.gradient.startPointX"
                  options:NSKeyValueObservingOptionNew
                  context:@"myDocument"];
        // second attempt -- not live when the first attempt is compiling
        [self.theme.gradient addObserver:self
                              forKeyPath:@"startPointX"
                                 options:NSKeyValueObservingOptionNew
                                 context:@"myDocument"];
    }
    return self;
}

- (void)didChangeValueForKey:(NSString *)key
{
    NSLog(@"Document notified that \"%@\" has changed.", key);
}

-

Theme.m

- (instancetype)init
{
    if (self = [super init]) {
        self.gradient = [[Gradient alloc] init];
    }
    return self;
}

-

Gradient.h

@interface Gradient : NSObject

@property (strong, nonatomic) NSNumber *startPointX;

@end 

-

Gradient.m

- (instancetype)init
{
    if (self = [super init]) {
        self.startPointX = @(0.47f);
    }
    return self;
}

- (void)didChangeValueForKey:(NSString *)key
{
    if ([key isEqualToString:@"startPointX"]) {
        NSLog(@"Gradient notified a change to %@ has occurred.", key);
}

事实证明,如果您实施 -didChangeValueForKey: 它 blocks/suspends 您可能正在观察的那些属性的正常通知。

注释掉我的 Gradient.m 实现

- (void)didChangeValueForKey:(NSString *)key
{
    NSLog(@"'%@' has been changed.", key);
}

使我对文档的观察开始正常工作。