2

Interface Builder を使用して NSMenu を作成しました。KBAppController.m で定義されている showPreferencesPanel メソッドと呼ばれるメニュー項目の 1 つ:

-(void)showPreferencesPanel {
    //something
}

ここで、IB を使用せずにメニューを再構築する必要があります... すべてプログラムで行います。StatusMenu.m はそのすべてを処理するクラスであり、メソッドが別のクラスから呼び出されるように設定する必要があるターゲットがわかりません。

そのクラスのインスタンスを作成できませんでした! メニュー項目はグレー表示されます。

StatusMenu.m

KBAppController *kbAppController = [[KBAppController alloc]init];
NSMenuItem* preferencesItem;
[preferencesItem setTarget:kbAppController];
preferencesItem = [[NSMenuItem alloc] initWithTitle:@"Preferences…" action:@selector(showPreferencesPanel) keyEquivalent:@""];

編集: -----------------------------------------------

クラス KBAppController のオブジェクトを使用する更新されたコードを次に示します。良いニュースは、設定メニュー項目が有効になっていることですが、それでも KBAppController.m のメソッドを呼び出しません:(

KBStatusMenu.m

@synthesize kbAppController = _kbAppController;

someMethod {   
NSMenuItem* preferencesItem;
preferencesItem = [[NSMenuItem alloc] initWithTitle:@"Preferences…" action:@selector(showPreferencesPanel) keyEquivalent:@""];
[preferencesItem setTarget:self];
}

- (void)showPreferencesPanel {
NSLog(@"in 1");
[_kbAppController showPreferencesPanel];
}

KBAppController.m

-(void)showPreferencesPanel {
    NSLog(@"in 2");
    //something
}
4

2 に答える 2

1

NSMenuItem には- (void)setTarget:(id)anObjectand- (void)setAction:(SEL)aSelectorがあり、そのトリックを行う必要があります。

最初に NSMenuItem を設定して初期化してください。現在-setAction、初期化されていないオブジェクトを呼び出しています。

preferencesItem = [[NSMenuItem alloc] initWithTitle:@"Preferences…" action:@selector(showPreferencesPanel) keyEquivalent:@""];
[preferencesItem setTarget:kbAppController]
于 2012-08-23T20:55:14.433 に答える
0

クラスselectorからメソッドを呼び出します。そして、そのメソッド内でshowPreferencePanel()、 のオブジェクトを呼び出しますKBAPPController

KBAppController のオブジェクトを StatusMenu のプロパティとして設定してください。

于 2012-08-23T20:55:16.870 に答える