我的基于文档的应用程序是在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);
}
答案 0 :(得分:0)
事实证明,如果你实现-didChangeValueForKey:它会阻止/暂停你可能正在观察的那些属性的正常通知。
评论我的
的Gradient.m实现- (void)didChangeValueForKey:(NSString *)key
{
NSLog(@"'%@' has been changed.", key);
}
导致我对Document的观察开始正常工作。