2012-03-24 14 views
2

私はNSMenu(メインメニューと言うことがある)があり、その中にはNSMenuがたくさんあり、レベルはそれぞれNSMenuItemです。NSMenuItemのNSMenuItemをタイトルで取得する

ツリーパス(対応するNSMenus/NSMenuItemsのタイトルを含む)を指定してNSMenuItemインスタンスを取得できます。

例:

メニュー:

  • ファイル
    • オープン
      • ドキュメント
      • プロジェクト
    • 保存
    • 名前を付けて保存...

パス: /ファイル/オープン/ドキュメント

あなたが、それについてどのように行くだろう最も効率的でココアに優しい方法ですか?

答えて

3

私は、NSMenuItemのタイトルまたはより良いカスタム定義タグを指定することで最も良い方法が得られると考えています。

#define kMenuFileNew 1 
#define kMenuFileOpen 2 

NSMenu *menu = [[NSMenu alloc] initWithTitle:@"File"]; 
NSMenuItem *item1 = [[NSMenuItem alloc] initWith..]; 
item1.tag = kMenuFileOpen; 
[menu addItem:item1]; 


NSMenuItem* item2 = [menu itemWithTag:kMenuFileOpen]; 
+0

確かに、しかし、私はちょうどNSMenuItemを取得していないやろうとしています。他のサブメニューのNSMenu内のNSMenuItemなど...タイトルのパスを指定することで...--)(私は今作業しています、見てみましょう...) –

+0

私はそれを作った!うん!私はコミュニティの答えとして解決策を投稿しています... :-) –

1

です。 をNSMenuに作成し、再帰を使用して解決しました。

コード:

- (NSMenuItem*)getItemWithPath:(NSString *)path 
{ 
    NSArray* parts = [path componentsSeparatedByString:@"/"]; 
    NSMenuItem* currentItem = [self itemWithTitle:[parts objectAtIndex:0]]; 

    if ([parts count]==1) 
    { 
     return currentItem; 
    } 
    else 
    { 
     NSString* newPath = @""; 

     for (int i=1; i<[parts count]; i++) 
     { 
      newPath = [newPath stringByAppendingString:[parts objectAtIndex:i]]; 
     } 

     return [[currentItem submenu] getItemWithPath:newPath]; 
    } 
} 

用途:

NSMenuItem* i = [mainMenu getItemWithPath:@"View/Layout"]; 
+0

なぜこれをやっているのですか? IBでタイトルを作ったので、すでにメニュー項目を知っていて、各メニューに簡単にタグを付けることができたはずです。もしあなたがプログラムでそれをやり直すのであれば、それぞれのIDを知っておくべきです... – markhunte

+0

@markhunteまあ、私はネストされたサブメニュー/アイテムなどがたくさんある非常に拡張されたメインメニューを持っています。すべてのメニュー項目を参照することができ、それらのすべてのためのアウトレットを作成する必要もなく、タグ付けすることもできます(私が取り組んでいるコードベースはかなり巨大で、私はできるだけ読みやすく最小限に抑えようとしています...):-) –

+0

ユーザーのコンピュータが英語以外の言語にローカライズされている場合、またはAppleが将来のOSアップデートでアイテムのタイトルを変更した場合、これは失敗します。 –

関連する問題