从 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);
}
使我对文档的观察开始正常工作。
我的基于文档的应用程序是在 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);
}
使我对文档的观察开始正常工作。