观察对象未注册为观察者

从服务器请求检索的新数据刷新阵列控制器时出现问题。 设置 我有一个实体对象(称为“ 0”),它具有一些属性: 名称 年龄 描述 widgetID 还有一个实体对象(称为MyWidget),它具有一些属性: 名称 尺寸 描述 大小是1个对象的字符串表示形式。它使从核心数据存储到服务器以及从JSON返回的存储和检索变得容易。为了表示UI中的大小,我对MyWidget进行了子类化,并提供了一个自定义setter和getter作为自定义类的类别(这样做是为了避免需要对Xcode进行更改的情况,Xcode不会覆盖我的更改)模型):
-(void)setObjectWidth:(NSInteger)aValue {
    [self setObjectSize:NSMakeSize(aValue, [self objectHeight])];
}

-(void)setObjectHeight:(NSInteger)aValue {
    [self setObjectSize:NSMakeSize([self objectWidth], aValue)];
}

-(void)setObjectSize:(NSSize)aValue {
    [self setSize:NSStringFromSize(aValue)];
}

-(NSInteger)objectWidth {
    return [self objectSize].width;
}

-(NSInteger)objectHeight {
    return [self objectSize].height;
}

-(NSSize)objectSize {
    return NSSizeFromString([self size]);
}
通过对
widgetId
进行查找,将
widget
作为父类的分类方法:
-(MyWidget *)widget {
    NSManagedObjectContext * moc = [[NSApp delegate] managedObjectContext];

    return [moc fetchObjectForEntityName:@\"MyWidget\"
                                 withUID:[self widgetID]];
}
fetchObjectForEntityName:withUID是托管对象上下文中的类别。 在UI中,我有一个绑定到
MyParent
对象的tableView的数组控制器。选择一个对象会在UI中显示详细信息,这些详细信息已绑定到适当的值: parentArrayController-> parentArray(数组中的托管对象) parentTable-> parentArrayController.arrangedObjects.name uiWidthTextField-> parentArrayController.selection.widget.objectWidth uiHeightTextField-> parentArrayController.selection.widget.objectHeight 观察阵列控制器的更改,以便它可以触发应用程序其他需要知道所选对象已更改的其他部分的通知 什么有效 一切正常。我可以对UI内的文本字段进行更改,并按您的期望进行设置并从小部件中获取大小。添加父项是创建NSURLConnection并将适当的参数发送到服务器的简单任务。服务器确认添加后,我再次请求服务器提供父项列表。 将下来的列表与核心数据中的现有列表进行比较,并添加新项,并对已经存在的其他对象值进行任何其他更改。 坏了什么 当列表返回时,它被正确解析,但是应用程序在更新阵列控制器时抱怨:   严重的应用程序错误。在核心数据更改处理期间捕获了异常:无法从中删除键路径“ widget.objectHeight”的观察者,因为它没有注册为观察者。与userInfo(空)      无法从中删除键路径“ widget.objectHeight”的观察者,因为它没有注册为观察者。 我尝试过的 我尝试添加将willChangeValueForKey:和didChangeValueForKey:包裹在objectHeight和objectWidth的设置器周围,但这似乎没有任何帮助。 我相信问题是因为IB绑定到
widget.objectHeight
,并且小部件是对父级的查找,而不是真正的KVO / KVC属性。但是,我不需要设置set3 set(尽管我接下来会尝试)。 我知道我缺少了一些东西,但是无法将手指放在上面。 辩诉 任何帮助或协助解决此问题将不胜感激!     
已邀请:
您需要将
objectWidth
objectHeight
设置为MyWidget的非模型属性。您遇到了KVO问题,因为
objectWidth
objectHeight
不是MyWidget的键,而仅具有getter和setter形式的方法名称。 只需添加:
@property() NSInteger objectWidth;
@property() NSInteger objectHeight;
到MyWidget类,并且应该提供KVO起作用的密钥。 (可能想仔细检查我的属性形式。我不得不写一个整数属性已经有一段时间了。)     

要回复问题请先登录注册