gpt4 book ai didi

cocoa - 根据计算值,为计算值设置 KVO

转载 作者:行者123 更新时间:2023-12-03 16:05:28 24 4
gpt4 key购买 nike

所以我有两个对象,Invoice 和 InvoiceLineItem。 InvoiceLineItem 有一个名为 cost 的属性它是根据其他属性动态创建的。为了帮助我使用 KVO/绑定(bind):

+ (NSSet *)keyPathsForValuesAffectingCost {
return [NSSet setWithObjects:@"lineItemType", @"serviceCost", @"hourlyRate", @"timeInSeconds", @"productCost", @"quantityOfProduct", @"mileageCost", @"milesTraveled", nil];
}

这很好用。当我编辑像 serivceCost 这样的属性时, TableView 中的主要成本会很好地更新。

在 Invoice 对象中,我有一个 InvoiceLineItems 的 NSMutableArray。发票有一个类似的属性,称为 totalCost 。它是通过迭代订单项来计算的,只要订单项没有标记为已删除(我出于同步原因而这样做),它就会累加成本并创建总成本。

现在是我的问题/问题。如何设置发票的总成本,以便在订单项的成本之一发生更改时它可以与 KVO/绑定(bind)一起使用?

我尝试设置:

+ (NSSet *)keyPathsForValuesAffectingTotalCost {
return [NSSet setWithObjects:@"lineItems.cost", nil];
}

但它不起作用。我最终在控制台中出现错误:[<NSCFArray 0x1499ff40> addObserver:forKeyPath:options:context:] is not supported. Key path: cost

最佳答案

我不认为自动 KVO 传播支持多对多关系。文档没有明确说明其中一种方式,但从我对 KVO 的了解来看,观察一对多关系的子键往往并非易事。

我解决此问题的方法是通过为 InvoiceLineItem 对象上的 lineItems 属性实现一对多 KVC 访问器来手动观察每个 InvoiceLineItem 对象的 cost 属性。 Invoice 类分别在 insert/remove 方法中执行 addObserver/removeObserver 调用,然后使用 willChangeValueForKey:/didChangeValueForKey: 手动触发 totalCost 更改。像这样的东西(粗略的代码、免责声明等):

- (void)insertObject:(InvoiceLineItem*)newItem inLineItemsAtIndex:(unsigned)index
{
[newItem addObserver:newItem forKeyPath:@"cost" options:0 context:kLineItemContext];
[lineItems insertObject:newItem atIndex:index];
}

- (void)removeObjectFromLineItemsAtIndex:(unsigned)index
{
[[lineItems objectAtIndex:index] removeObserver:self forKeyPath:@"cost"];
[lineItems removeObjectAtIndex:index];
}

- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
{
if (context == kLineItemContext)
{
[self willChangeValueForKey:@"totalCost"];
[self didChangeValueForKey:@"totalCost"];
}
}

关于cocoa - 根据计算值,为计算值设置 KVO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/612474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com