NSTextField 不使用核心数据绑定更新计算属性

Posted

技术标签:

【中文标题】NSTextField 不使用核心数据绑定更新计算属性【英文标题】:NSTextField does not update calculated property using Core Data bindings 【发布时间】:2013-01-23 17:27:52 【问题描述】:

SO 新手;我的第一个问题:

Re:Core Data,使用绑定的基于文档的应用程序:

我有一个绑定到 NSArrayControllerNSTableView,绑定到一个实体 LineItem,其中几列绑定到以下 LineItem 属性/属性:amountpricetotal。我正在使用 +keyPathsForValuesAffectingTotal 来观察 amountprice 的变化。 total 属性会随着任何更改立即更新。 我有另一个实体,Item。它与 LineItem 具有一对多的关系(items),因为每个 Item 都可以有许多 LineItemsItem 也有一个绑定到 NSArrayControllerNSTableView,该 NSArrayController 绑定到其各自的实体 Item。此表也有几列,但其中一列是 lineItemTotal (items.@sum.total)。

- (NSNumber *)lineItemTotal 
     float totalOfAllLineItemTotals = [[self valueForKeyPath:@"items.@sum.total"]floatValue];
     [self willAccessValueForKey:@"lineItemTotal"];
     return [NSNumber numberWithFloat:totalOfAllLineItemTotals];
     [self didAccessValueForKey:@"lineItemTotal"];
     return [NSNumber numberWithFloat:totalOfAllLineItemTotals];

lineItemTotal 值使用 NSNotification NSManagedObjectContextObjectsDidChangeNotification 立即更新,它调用我的选择器 updateLineItemTotal: 发送一条消息:[ self.view setNeedsDisplay:YES]; 一切正常...但是,此视图应该看起来像收据。因此,正如用户所期望的那样,我在 LineItem 表下方有一个 NSTextField 来显示总数。我已经尝试将它绑定到与 Item 相同的 NSArrayController 上,但这不起作用。在绑定检查器中,我无法为 Controller Key 选择 arrangedObjects,因为它不是表格。 (这就是项目表的设置和正常工作方式)我唯一的选择是 Controller Key 的“选择”。无论如何,它总是显示正确的值,但只有在我创建了一个新的 Item 实例(通过 NSButton 绑定到 add:)并返回到旧的 Item 实例之后。它不会像其他所有内容一样立即更新:用户会发现这不专业。我已经尝试过 Hillegass 的建议、搜索 Stack Overflow 以及 Apple 推荐的关于在处理 NSSet 时更新值的变通办法。 Apple 建议设置通知。我这样做了,这次没有用。我已经尝试了所有明显的解决方法,但没有成功。我相信它归结为 KVCKVO;不幸的是,在使用 NSSets 时,Apple 对这些强大的工具几乎没有支持,至少表面上不支持。任何帮助,将不胜感激。

【问题讨论】:

【参考方案1】:

我在这里看到的第一个问题是,您似乎在所有语句执行之前从该方法返回:

- (NSNumber *)lineItemTotal 
     float totalOfAllLineItemTotals = [[self valueForKeyPath:@"items.@sum.total"]floatValue];
     [self willAccessValueForKey:@"lineItemTotal"];
     return [NSNumber numberWithFloat:totalOfAllLineItemTotals];
     // Anything below here will never be executed.
     [self didAccessValueForKey:@"lineItemTotal"];
     return [NSNumber numberWithFloat:totalOfAllLineItemTotals];

即便如此,我还是花了几分钟的时间编写了代码,根据我的经验,集合运算符(即@sum)似乎不适用于 CoreData 惰性获取集。我所做的任何尝试都会给我带来以下错误:

[<_NSFaultingMutableSet 0x101922270> addObserver:forKeyPath:options:context:] is not supported. Key path: @sum.total

幸运的是,您似乎可以使用 NSArrayController 来启用此集合运算符。我把我编码的版本up on github。我相信我已经涵盖了您试图在那里实现的所有基础。我有主/明细表视图和额外的文本字段,所有实时更新等。

【讨论】:

以上是关于NSTextField 不使用核心数据绑定更新计算属性的主要内容,如果未能解决你的问题,请参考以下文章

将 NSTextField 绑定到 NSString

如何将同一个xib文件绑定到不同的核心数据实体

NSManagedObjectContext 保存导致 NSTextField 失去焦点

NStextfield 显示空占位符(即空字符串),而不是使用核心数据显示“无选择”。苹果漏洞?

带有核心数据的 Cocoa 绑定不更新所有列

更新 tableview 绑定到数组错误