2

我有一个显示锁的 ImageView,通知打开的文件是否被锁定。我有 2 张用于锁定和解锁案例的图像。我想将显示的图像与代表打开文件的对象的布尔值同步。

为此,我希望 ViewController 根据对象的锁定状态更改 ImageView 中的图像。所以 object 和 ViewController 都有一个属性“isLocked”。

我怎样才能同步它们?在 IB 中这很容易,但我不知道如何以编程方式进行。我尝试在我的 ViewController 的初始化方法中使用:

[ViewController bind:@"value" toObject:[ArrayController selection] withKeyPath:@"isLocked" options:nil];

但它不起作用。在文档中据说我必须在使用它之前公开我的绑定。

我尝试将以下代码放入对象的初始化方法中:

[self exposeBinding:@"isLocked"];

但是 Xcode 不能识别这种方法。

有人有建立这种绑定的经验吗?

4

2 回答 2

6

正如@nick 所说,您需要 Key-Value-Observing。

[arrayController addObserver:self 
                forKeyPath:@"selection.isLocked"
                options:NSKeyValueObservingOptionNew
                context:@"this_context"]

然后,当 isLocked 更改时,将调用您添加到 viewController 的 -observeValueForKeyPath:ofObject:change:context: 方法(只要您仅以符合 KVC 的方式操作 isLocked)。

options 参数使您可以选择精确地调整触发通知的条件以及与通知一起发送的数据。context 参数可以帮助您区分您注册接收的通知和您的超类注册接收的通知。它是可选的。

绑定似乎对保持两个值同步很有用。然而,这根本不是他们所做的

是的,很多事情似乎给人的印象是这就是他们所做的,并没有说这不是他们所做的,还有很多人认为这是他们所做的——但不,你不能为此使用它们。

只有少数类支持绑定(它们在此处列出),然后,这是重要的一点,这些类仅支持绑定它们的命名绑定,并且这些绑定不是实例变量。例如, NSTextField有一个' fontFamilyName ' 绑定但NSTextField没有'fontFamilyName' 属性或实例变量,即使是派生的。NSTextField 确实有一个“isBordered”属性,但没有绑定——所以你不能绑定“isBordered”。

它并不意味着“绑定”任意类的任意属性。

于 2011-04-04T17:29:48.480 回答
2

是的,您可以绑定两个任意值,以下代码可以正常工作:

#import <Cocoa/Cocoa.h>

@interface SomeObject : NSObject

@property (retain,nonatomic) id someValue;

@end
@implementation SomeObject

@end

int main()
{
   SomeObject *source=[SomeObject new];
   SomeObject *target=[SomeObject new];

   [target bind:@"someValue" toObject:source withKeyPath:@"someValue" options:0];
   [source bind:@"someValue" toObject:target withKeyPath:@"someValue" options:0];

   [source setSomeValue:@(42)];
   NSLog(@"target: %@",[target someValue]);


   [target setSomeValue:@(22)];
   NSLog(@"source: %@",[source someValue]);

  return 0;
}

据我所知,问题出在位[ArrayController selection]。第一个问题是ArrayController(或应该是)一个类,而获得类的选择可能毫无意义。另一个问题是,即使这是一个实例,您也会在调用时绑定到选择,这几乎肯定不是您想要的。您希望在当前选择更改时对其进行跟踪。

所以你想要的可能是这样的:

[myViewController bind:@"value" toObject:myArrayController withKeyPath:@"selection.isLocked" options:nil];
于 2014-03-15T08:24:49.907 回答