gpt4 book ai didi

objective-c - NSMenuItem 的值与 BOOL 绑定(bind)

转载 作者:搜寻专家 更新时间:2023-10-30 20:23:36 25 4
gpt4 key购买 nike

我在将 NSMenuItem 的“值”绑定(bind)到 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

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

谢谢。

最佳答案

Cocoa Bindings 使用 Key-Value Observing (KVO) 获取模型对象变化的通知。为了让观察者注意到模型中的更改(您的 BOOL 值),包括使用绑定(bind)的任何 View ,您必须使用 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 观察者(包括您的菜单绑定(bind))都会收到更改通知。

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

我上传了一个 sample project演示它是如何完成的。

关于objective-c - NSMenuItem 的值与 BOOL 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2242580/

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