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

我的基于文档的应用程序是在Xcode 6.3中没有故事板的情况下创建的,所以它没有窗口控制器就开始了生活(我还没有窗口控制器 - 只是试图给出一些背景和上下文)。

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

我的文档类拥有对主题对象的引用。

我的主题类拥有对Gradient对象的引用。

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

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

那么为什么当我请求观察渐变起始点的滑块后,在我的Document类中不会出现类似的通知?

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:它会阻止/暂停你可能正在观察的那些属性的正常通知。

评论我的Gradient.m实现

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

导致我从文档的观察开始正常工作。

链接地址: http://www.djcxy.com/p/85277.html

上一篇: Bindings working from IB, not from my addObserver...

下一篇: Two way binding when setter is overriden