3

我在将 NSMenuItem 的“值”绑定到 BOOL 时遇到一些问题。

我将问题简化为:

1) 菜单项必须调用更改 BOOL 值的操作方法,否则它不起作用(即,如果 NSButton 调用更改 BOOL 值的方法,则菜单项不会更新)

2) 即使动作方法使 BOOL 成为常量(即enabled = YES),菜单项的“值”仍然交替出现。

有任何想法吗?我很混乱!

这是代码:

MenuBindings_AppDelegate.h

#import <Cocoa/Cocoa.h>

@interface Menu_BindingsAppDelegate : NSObject <NSApplicationDelegate> 
{   
   BOOL foo;
}

- (IBAction)toggle:(id)sender;
- (IBAction)makeYes:(id)sender;

@property BOOL foo;

@end

Menu_BindingsAppDelegate.m

@implementation Menu_BindingsAppDelegate

@synthesize foo;

- (IBAction)toggle:(id)sender
{
   [self setFoo:!foo];
}

- (IBAction)makeYes:(id)sender
{   
   [self setFoo:YES];
}

@end

在我的笔尖中,我有一个连接到 -makeYes: 操作的按钮和一个连接到 -toggle: 操作的菜单项。菜单项的“值”绑定绑定到应用程序委托的“foo”属性。

谢谢。

4

1 回答 1

2

Cocoa Bindings 使用键值观察(KVO) 来获取模型对象更改的通知。为了让BOOL观察者(包括使用绑定的任何视图)注意到模型(您的值)的变化,您必须使用符合Key-Value Coding的访问器方法更新模型。如果只是直接设置 ivar 的值,则不会发送任何 KVO 通知。

您可以自己实现 KVC 访问器,也可以声明一个属性并@synthesize在您的实现中使用关键字让编译器为您创建兼容的访问器。

这是您将如何实现符合 KVC 的访问器的方式:

//YourModel.h
@interface YourModel : NSObject
{
    BOOL enabled;
}
- (BOOL)enabled;
- (void)setEnabled:(BOOL)flag;
@end

//YourModel.m
@implementation YourModel
- (BOOL)enabled
{
    return enabled;
}
- (void)setEnabled:(BOOL)flag
{
    enabled = flag;
}
@end

这就是使用 Objective-C 2.0 属性语法做同样事情的方法:

//YourModel.h
@interface YourModel : NSObject
{
    BOOL enabled;
}
@property BOOL enabled;
@end

//YourModel.m
@implementation YourModel
@synthesize enabled;
@end

然后,您可以调用[yourModel setEnabled:YES]任何已注册的 KVO 观察者(包括您的菜单绑定)将被告知更改。

或者,您可以调用yourModel.enabled = YESwhich 将使用适当的 KVC 访问器(如果可用)。

我上传了一个示例项目来演示它是如何完成的。

于 2010-02-11T07:07:53.180 回答