2012-03-24 2 views
2

У меня есть NSMenu (скажем, Главное меню), с большим количеством NSMenu s в нем и NSMenuItem s на разных уровнях.Получение NSMenuItem дерева NSMenu по названию

Я хочу, чтобы экземпляр NSMenuItem указывал путь к дереву (с названием соответствующих NSMenus/NSMenuItems в нем).

Пример:

Меню:

  • Файл
    • Новый
    • Открыть
      • Документ
      • Проект
    • Сохранить
    • Сохранить как ...

Путь:/Файл/Открыть/Документ

Как бы вы об этом, в самый эффективный и удобный для какао?

ответ

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; но NSMenuItem внутри NSMenu внутри другого подменю и т. д., указав путь заголовков ... :-) (я сейчас над этим работаю, давайте посмотрим ...) –

+0

Я сделал это !!! Да! Я отправляю решение в качестве ответа для сообщества ... :-) –

1

Итак, вот оно; решается путем создания Category по адресу 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 и можете легко пометить каждое меню. Или если вы делаете их программно снова, вы должны знать каждый из них ... – markhunte

+0

@markhunte Ну, у меня ОЧЕНЬ РАСШИРЕННОЕ Главное меню с множеством вложенных подменю/элементов и т. Д. ... и хотел FAST однострочный, чтобы я может ссылаться на любой пункт меню, без необходимости создавать выходы для всех из них или пометить их и т. д. (база кода, над которой я работаю, довольно ОГРОМНАЯ, и я стараюсь держать ее как можно более доступной и минимальной ...) :-) –

+0

Это не удастся, если компьютер пользователя будет локализован на любом неанглийском языке или если Apple изменит заголовок элемента в будущем обновлении ОС. –