gpt4 book ai didi

cocoa - 多层 cocoa 绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 16:38:26 25 4
gpt4 key购买 nike

当我绑定(bind)到多级键路径时,例如objectValue.person.photo,它不会在人物更改时更新,仅在照片更改时更新。这似乎是一个问题,因为只有路径中的最后一个键被观察到有变化。

是否可以观察多个级别的绑定(bind)?例如,在 SproutCore 中,如果您在路径中放置一个星号,则将观察其后面的所有内容是否发生变化 (objectValue*person.photo)。

最佳答案

如果您的绑定(bind)在 objectValue.person 更改时没有更新,那么这通常意味着 objectValue 中的任何对象都不符合键的键值观察person. 通过正确实现的对象,沿 keyPath 的非叶突变可以正常工作。例如,从基本的非文档 Cocoa 应用程序模板开始,我编写了以下示例:

标题:

@interface Person : NSObject
@property (copy) NSString* name;
@end

@interface Car : NSObject
@property (retain) Person* driver;
@end

@interface SOAppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (retain) Car* car;

- (IBAction)replaceCar:(id)sender;
- (IBAction)replaceDriver:(id)sender;
- (IBAction)changeName:(id)sender;

@end

实现:

@implementation Person
@synthesize name;
@end

@implementation Car
@synthesize driver;
@end

@implementation SOAppDelegate
@synthesize car = _car;
@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
Person* person = [[[Person alloc] init] autorelease];
person.name = @"Default Name";
Car* car = [[[Car alloc] init] autorelease];
car.driver = person;
self.car = car;
}

- (IBAction)replaceCar:(id)sender
{
Person* person = [[[Person alloc] init] autorelease];
person.name = @"Replaced Car";
Car* newCar = [[[Car alloc] init] autorelease];
newCar.driver = person;
self.car = newCar;
}

- (IBAction)replaceDriver:(id)sender
{
Person* person = [[[Person alloc] init] autorelease];
person.name = @"Replaced Driver";
self.car.driver = person;
}

- (IBAction)changeName:(id)sender
{
self.car.driver.name = @"Changed Name";
}

@end

然后在 .xib 中,我添加了三个按钮,调用每个 IBAction,并添加了一个标签,其 value 属性绑定(bind)到 App Delegate,其 keyPath 为 car.driver.name

按下任何按钮都会导致绑定(bind)标签更新,尽管事实上只有其中一个按钮实际上修改了绑定(bind) keyPath (car.driver.name) 指向的确切值。 KVO 合规性通过标准 @synthesized 属性免费提供,因此无论它们来自 keyPath 的哪个级别,我们都能获得适当的更新。

简而言之,绑定(bind)按照您希望的方式工作(即,它们针对复合 keyPath 中非叶节点键的更改进行更新)。 objectValueperson 中的对象实现存在缺陷,导致无法正常工作。我会去那里看看。

另请注意,如果其中一个是集合,则观察集合与观察集合中的所有对象不同。请参阅this page了解更多信息。

PS:是的,我知道这个例子会泄漏内存。您可以自己想象相关的-dealloc方法。

关于cocoa - 多层 cocoa 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8829422/

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