Objective c 观察对象未注册为观察者

Objective c 观察对象未注册为观察者,objective-c,core-data,cocoa-bindings,nsmanagedobject,nsarraycontroller,Objective C,Core Data,Cocoa Bindings,Nsmanagedobject,Nsarraycontroller,当使用从服务器请求检索的新数据刷新阵列控制器时,我遇到问题 设置 我有一个名为MyParent的实体对象,它有几个属性: name age description widgetID name size description 我通过在widgetId上作为父对象上的category方法进行查找来获取小部件: -(MyWidget *)widget { NSManagedObjectContext * moc = [[NSApp delegate] managedObjectContext

当使用从服务器请求检索的新数据刷新阵列控制器时,我遇到问题

设置

我有一个名为MyParent的实体对象,它有几个属性:

name age description widgetID name size description 我通过在widgetId上作为父对象上的category方法进行查找来获取小部件:

-(MyWidget *)widget {
    NSManagedObjectContext * moc = [[NSApp delegate] managedObjectContext];

    return [moc fetchObjectForEntityName:@"MyWidget"
                                 withUID:[self widgetID]];
}
fetchObjectForEntityName:withUID是托管对象上下文中的一个类别

在UI中,我有一个数组控制器绑定到MyParent对象的tableView。选择对象会在UI中显示绑定到适当值的详细信息:

parentArrayController --> parentArray (managed objects in an array) parentTable --> parentArrayController.arrangedObjects.name uiWidthTextField --> parentArrayController.selection.widget.objectWidth uiHeightTextField --> parentArrayController.selection.widget.objectHeight 观察阵列控制器的更改,以便它可以为应用程序中需要知道所选对象已更改的其他部分发出通知

什么有效

一切正常。我可以对UI中的文本字段进行更改,它会按照您的预期从小部件中设置并获取大小。添加父项是创建NSURLConnection并将适当的参数发送到服务器的简单任务。当服务器确认添加时,我再次从服务器请求父项列表

将下拉列表与核心数据中的现有列表进行比较,并添加新项,并对已有的其他对象值进行任何其他更改

什么坏了

当列表返回时,将正确解析该列表,但当更新阵列控制器时,应用程序会抱怨:

严重的应用程序错误。核心数据更改处理期间捕获异常:无法从中删除密钥路径小部件的观察者。objectHeight,因为它未注册为观察者。用户信息为空

无法从中删除key path widget.objectHeight的观察者,因为它未注册为观察者

我试过的

我曾尝试在objectHeight和objectWidth的setter周围添加willChangeValueForKey:和didChangeValueForKey:包装,但这似乎没有提供任何资源

我认为问题是因为IB绑定到widget.objectHeight,而widget是父级上的查找,而不是真正的KVO/KVC属性。然而,我不需要在小部件上使用setter,尽管我下一步会尝试

我知道我遗漏了一些东西,但我无法确定我的手指在哪里

抗辩

任何帮助或协助解决此问题都将不胜感激

您需要将objectWidth和objectHeight设置为MyWidget的非建模属性。您遇到了KVO问题,因为objectWidth和ObjectHeights不是MyWidget的键,只是具有getter和setter形式的方法名

只需添加:

@property() NSInteger objectWidth;
@property() NSInteger objectHeight;

到MyWidget类,它应该提供KVO工作的密钥。可能想再次检查我的财产表。有一段时间我不得不写一个整数属性。

谢谢你的回复。我尝试将@property添加到模型中,但没有任何效果。然后,我用适当的willChangeValue和willAccessValue包装每个setter/getter。没有快乐。然后,我将它们从类别中移出,直接放到模型对象上。还是不走运:-据我所知,正如你所指出的,它是失败的。这是有道理的。我还尝试使用AutomaticallyNotifieServersForkey禁用自动通知,并为那些键返回NO objectHeight等。至少可以说是令人沮丧的!最后,我又开始着手解决我的悬而未决的问题。你的解决方案奏效了。我没有意识到我已经将setter和getter设置为不执行自动通知,因此合成的setter和getter没有触发KVC通知。快速修复,一切正常。谢谢
@property() NSInteger objectWidth;
@property() NSInteger objectHeight;