gpt4 book ai didi

objective-c - Cocoa 绑定(bind)不反向更新

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

我试图理解 Cocoa 绑定(bind)的方向性。特别是,我编写了这个小程序来演示绑定(bind),但我不确定它为什么输出它的功能。程序如下:

@interface SimpleClass : NSObject
@property (retain) NSString *s;
@end

@implementation SimpleClass
@end

int main(int argc, char *argv[]) {
SimpleClass *simpleClass1 = [[SimpleClass alloc] init];
SimpleClass *simpleClass2 = [[SimpleClass alloc] init];

[simpleClass1 bind:@"s" toObject:simpleClass2 withKeyPath:@"s" options:nil];

//[simpleClass1 willChangeValueForKey:@"s"];
simpleClass1.s = @"Hello, World!";
//[simpleClass1 didChangeValueForKey:@"s"];

NSLog(@"%@", simpleClass1.s);
NSLog(@"%@", simpleClass2.s);

simpleClass2.s = @"Something else!";

NSLog(@"%@", simpleClass1.s);
NSLog(@"%@", simpleClass2.s);

return 0;
}

当我运行这个程序时,输出是:

Hello, World!
(null)
Something else!
Something else!

这让我相信绑定(bind)是单向的。然而,我遇到过thisthis两者似乎都说绑定(bind)应该是双向的(尽管两者都不是很清楚)。取消注释 willChangeValueForKey 和 didChangeValueForKey 行不会影响输出。

我关于绑定(bind)是单向的结论是否正确?或者是否有某种方法可以在绑定(bind)创建时指定它应该是双向的?

最佳答案

NSObject 中绑定(bind)的默认实现是单向的。绑定(bind)有效 read-only .

其他 Cocoa 类会覆盖全部或部分默认实现以提供更强大的功能。 Apple 关于如何在您自己的类(class)中执行此操作的指南是 here 。请注意,我不认为 Cocoa 的任何类都以这种方式实现绑定(bind)。

另请查看 message flow in bindings 的讨论.

请注意,由于类可以按照自己的需要实现 NSKeyValueBindingCreation 协议(protocol),因此绑定(bind)名称不一定对应于属性。例如,NSTextField 有一个 "value" binding ,但没有“值”属性(没有符合此类属性的键值编码命名约定的 getter 或 setter)。

事实上,NSObject 提供的默认实现确实使用 KVC 设置一个与绑定(bind)到对象的属性更改时绑定(bind)的对象同名的属性:具体到该实现。当然,任何不重写该实现的东西都将继承它,但有些类确实会重写它。

关于objective-c - Cocoa 绑定(bind)不反向更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27120357/

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