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

私の nib には、-makeYes: アクションに接続されたボタンと、-toggle: アクションに接続されたメニュー項目があります。メニュー項目の「値」バインディングは、アプリ デリゲートの「foo」属性にバインドされます。

ありがとう。

4

1 に答える 1

2

Cocoa Bindings は、Key-Value Observing (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 = YESまたは、適切な KVC アクセサーが利用可能な場合は、それを使用する which を呼び出すことができます。

サンプル プロジェクトをアップロードして、それがどのように行われたかを示します。

于 2010-02-11T07:07:53.180 に答える