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

时间:2015-06-08 18:33:01

标签: cocoa cocoa-bindings

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

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

My Document类包含对Theme对象的引用。

My Theme类包含对Gradient对象的引用。

My 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);
}

1 个答案:

答案 0 :(得分:0)

事实证明,如果你实现-didChangeValueForKey:它会阻止/暂停你可能正在观察的那些属性的正常通知。

评论我的

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

导致我对Document的观察开始正常工作。