Objective c Cocoa:绑定到复合对象并观察子属性
是否可以绑定到自定义对象并在该对象的特定属性更改时收到通知 例如: 每个sales rep对象都有一个对sales statistics对象的引用,其中包含汽车和卡车销售的统计数据。自定义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属性时,我需要一种更新视图的方法。当前它不更新,因为它已绑定到父对象 我希望避免为每种销售类型建立绑定(这只是一个示例,我的具体案例更复杂) 你说
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:
手动通知的情况下达到预期效果,非常感谢!使用关键路径是我遗漏的部分。非常感谢!使用关键路径是我缺少的部分。