0

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

回复:核心数据,使用绑定的基于文档的应用程序:

我有一个NSTableView绑定到NSArrayController,绑定到实体LineItem,有几列绑定到以下LineItem属性/属性:amountpricetotal。我正在使用 + keyPathsForValuesAffectingTotal来观察amountprice的变化。属性total会随任何更改立即更新。我有另一个实体Item。它与LineItem具有一对多的关系( items),因为每个Item 可以有很多行项目Item也有一个NSTableView绑定到一个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,但这不起作用。在绑定检查器中,我不能为控制器键选择排列对象 ,因为它不是一张桌子。(这就是 Item Table 的设置和正常工作方式)我唯一的选择是Controller Key的“选择” 。无论如何,它总是显示正确的值,但只有在我创建了一个新的 Item 实例(通过NSButton绑定到 add:) 并返回到旧的 Item 实例之后。它不会像其他所有内容一样立即更新:用户会发现这不专业。我已经尝试了 Hillegass 的建议,搜索了 Stack Overflow,以及 Apple 推荐的关于在处理NSSet时更新值的变通方法。Apple 建议设置通知。我这样做了,这次没有用。我已经尝试了所有明显的解决方法,但没有成功。我相信它归结为KVCKVO; 不幸的是,在使用NSSets时,Apple 对这些强大的工具几乎没有支持,至少表面上不支持。任何帮助,将不胜感激。

4

1 回答 1

0

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

- (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 来启用此集合运算符。我把我编码的版本放在 github 上。我相信我已经涵盖了您试图在那里实现的所有基础。我有主/详细表视图和额外的文本字段,所有实时更新等。

于 2013-02-19T01:55:48.543 回答