Objective c Cocoa:绑定到复合对象并观察子属性

Objective c Cocoa:绑定到复合对象并观察子属性,objective-c,cocoa,cocoa-bindings,key-value-observing,Objective C,Cocoa,Cocoa Bindings,Key Value Observing,是否可以绑定到自定义对象并在该对象的特定属性更改时收到通知 例如: 每个sales rep对象都有一个对sales statistics对象的引用,其中包含汽车和卡车销售的统计数据。自定义NSView用于在一个图形中绘制汽车和卡车销售 自定义视图需要访问完整的统计对象,因此我将其绑定到salerep.salesStats 但是,当我更改carSales属性时,我需要一种更新视图的方法。当前它不更新,因为它已绑定到父对象 我希望避免为每种销售类型建立绑定(这只是一个示例,我的具体案例更复杂) 你说

是否可以绑定到自定义对象并在该对象的特定属性更改时收到通知

例如:

每个sales rep对象都有一个对sales statistics对象的引用,其中包含汽车和卡车销售的统计数据。自定义
NSView
用于在一个图形中绘制汽车和卡车销售

自定义视图需要访问完整的统计对象,因此我将其绑定到
salerep.salesStats

但是,当我更改
carSales
属性时,我需要一种更新视图的方法。当前它不更新,因为它已绑定到父对象

我希望避免为每种销售类型建立绑定(这只是一个示例,我的具体案例更复杂)

你说:

// I tried this, but it does not work:
[salesRep willChangeValueForKey:@"salesStatistics"];
salesRep.salesStats.carSales = 50;
[salesRep didChangeValueForKey:@"salesStatistics"];
我的猜测是,这不起作用,因为您通知的键是
salestatistics
,但您绑定到的键是
salestats
。如果这些关键点是相同的,我希望这种方法能够奏效

除此之外,更好的方法可能是添加如下依赖项:

@implementation SBSalesRep

+ (NSSet *) keyPathsForValuesAffectingSalesStats
{
    return [NSSet setWithObjects: @"salesStats.carSales", @"salesStats.truckSales", nil];
}

@end
这将导致对键
salesStats
的任何观察(绑定或其他)也隐式观察
salesStats.carSales
salesStats.truckSales
,并应在不必手动通知的情况下实现所需的效果

// I tried this, but it does not work:
[salesRep willChangeValueForKey:@"salesStatistics"];
salesRep.salesStats.carSales = 50;
[salesRep didChangeValueForKey:@"salesStatistics"];
我的猜测是,这不起作用,因为您通知的键是
salestatistics
,但您绑定到的键是
salestats
。如果这些关键点是相同的,我希望这种方法能够奏效

除此之外,更好的方法可能是添加如下依赖项:

@implementation SBSalesRep

+ (NSSet *) keyPathsForValuesAffectingSalesStats
{
    return [NSSet setWithObjects: @"salesStats.carSales", @"salesStats.truckSales", nil];
}

@end

这将导致对键
salesStats
的任何观察(绑定或其他)也隐式地观察
salesStats.carSales
salesStats.truckSales
,并且应该在不必使用
-will/didChangeValueForKey:
手动通知的情况下达到预期效果,非常感谢!使用关键路径是我遗漏的部分。非常感谢!使用关键路径是我缺少的部分。