2012-04-19 11 views
0

私はNSMenuアプリケーションドックメニュー)とその中のいくつかの項目を同じアクションで持っています。親メニューのNSMenuItem(送信者)のインデックスを取得します

コンテナメニュー内の送信者アイテム(アクションをトリガーするアイテム)のインデックスを調べるにはどうすればよいですか? (私はtitleで興味がありません、それは重複かもしれないので)

それは私が試みたものですが、それは0(ゼロ)を返し続けます。

- (void)myAction:(id)sender 
{ 
    NSMenuItem* mi = (NSMenuItem*)sender; 

    int index = [[[mi parentItem] submenu] indexOfItem:mi]; 

    NSLog(@"Clicked item with index : %d",index); 
} 

(同じことを達成するためのより良いアプローチはありますか?)

+0

あなたのケースでは、あなたはおそらく、メニュー項目が参照するドキュメントを使用します違う行為? –

+0

@RobKenigerさて、メニューには、可変内容(および要素の可変数)が動的に設定されています...多少類似した方法で処理される...(実際には有効な文書名のリスト - NON-traditionalドキュメントベースのアプリ) –

答えて

3

メニュー項目 'representedObjectを使用して、アプリ内のオブジェクトへの参照を保存できます。

[aMenuItem setRepresentedObject:yourDocument]; 

あなたがそのようにのようにアクションでオブジェクトにアクセスできます:別のメニュー項目を呼び出していないのはなぜ

- (void)myAction:(id)sender 
{ 
    NSMenuItem* mi = (NSMenuItem*)sender; 
    YourDocument* doc = (YourDocument*)[sender representedObject]; 
    //do something with doc 
} 
+0

興味深いアイデア。私はメニューの母集団ルーチンの背後にある論理を根本的に変えなければならない。私はおそらくそれを試してみましょう!どうもありがとう! ;-) –

+0

私は最終的に、作成時に 'NSMenuItem'の' keyEquivalent'プロパティに 'index'を渡しました。 ;-) –

+4

これは 'keyEquivalent'を悪用するようなものです。インデックスだけを必要とするならば、そのインデックスを 'NSNumber'として保存し、その' NSNumber'オブジェクトをメニュー項目の 'displayedObject'として保存するほうが良いでしょう。 –

関連する問題