gpt4 book ai didi

objective-c - Cocoa:绑定(bind)到复合对象并观察子属性

转载 作者:行者123 更新时间:2023-12-03 17:13:19 25 4
gpt4 key购买 nike

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

示例:

每个销售代表对象都有一个对销售统计对象的引用,其中包含汽车和卡车销售的统计信息。自定义 NSView 用于在一张图形中绘制汽车和卡车销售情况。

自定义 View 需要访问完整的统计信息对象,因此我将其绑定(bind)到 salesRep.salesStats

但是,当我更改 carSales 属性时,我需要一种方法来更新 View 。目前它不会更新,因为它绑定(bind)到父对象。

我想避免为每种销售类型建立绑定(bind)(这只是一个示例,我的具体情况更为复杂)。

@interface SBSalesRep : NSObject {

@property (strong) SBSalesStatistics *salesStats;
}

@interface SBSalesStatistics : NSObject
{
@property (assign) NSInteger carSales;
@property (assing) NSInteger truckSales;
}

@interface SBProgressView : NSView
{
@property (strong) SBSalesStatistics *statsToDisplay;
}

// Setup
SBSalesRep *salesRep = [SBSalesRep new];

// Bind to stats object, because we need car and tuck sales:
[progressView bind:@"statsToDisplay"
toObject:salesRep
withKeyPath:@"salesStats" // How to get notified of property changes here?
options:nil];

// This needs to trigger an update in the statistics view
salesRep.salesStats.carSales = 50;

// I tried this, but it does not work:
[salesRep willChangeValueForKey:@"salesStatistics"];
salesRep.salesStats.carSales = 50;
[salesRep didChangeValueForKey:@"salesStatistics"];

最佳答案

你说:

// I tried this, but it does not work:
[salesRep willChangeValueForKey:@"salesStatistics"];
salesRep.salesStats.carSales = 50;
[salesRep didChangeValueForKey:@"salesStatistics"];

我的猜测是这不起作用,因为您通知的键是 salesStatistics,但您绑定(bind)的键是 salesStats。如果这些键相同,我希望这种方法能够发挥作用。

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

@implementation SBSalesRep

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

@end

这将导致对键 salesStats 的任何观察(绑定(bind)或其他方式)也隐式观察 salesStats.carSalessalesStats.truckSales,并且应该达到预期的效果,而无需使用 -will/didChangeValueForKey: 手动通知。

关于objective-c - Cocoa:绑定(bind)到复合对象并观察子属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14646459/

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