Получить индекс NSMenuItem (отправителя) в родительском меню

У меня есть NSMenu (док-меню приложения) и несколько элементов в нем с одним и тем же действием.

Как я могу определить индекс отправителя (того, который запускает действие) в его контейнерном меню? (Меня не интересует title, так как это может быть дубликат)

Это то, что я пробовал, но он продолжает возвращать 0 (ноль).

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

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

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

Любые идеи? (Есть ли лучший подход для достижения того же самого?)


person Dr.Kameleon    schedule 19.04.2012    source источник
comment
Почему разные пункты меню не вызывают разные действия?   -  person Rob Keniger    schedule 19.04.2012
comment
@RobKeniger Что ж, меню динамически заполняется переменным содержимым (и переменным количеством элементов) ... которые должны обрабатываться в некоторой степени аналогичным образом ... (на самом деле список имен активных документов - в НЕТРАДИЦИОННОМ документе на основе приложения)   -  person Dr.Kameleon    schedule 19.04.2012


Ответы (1)


Вы можете использовать элементы меню representedObject для хранения ссылки на какой-либо объект в вашем приложении. В вашем случае вы, вероятно, использовали бы документ, на который ссылается этот пункт меню:

[aMenuItem setRepresentedObject:yourDocument];

Затем вы можете получить доступ к объекту в действии следующим образом:

- (void)myAction:(id)sender
{
    NSMenuItem* mi = (NSMenuItem*)sender;
    YourDocument* doc = (YourDocument*)[sender representedObject];
    //do something with doc
}
person Rob Keniger    schedule 19.04.2012
comment
Интересная идея; хотя мне все равно придется радикально изменить логику моих подпрограмм заполнения меню. Я, наверное, попробую! Большое спасибо! ;-) - person Dr.Kameleon; 19.04.2012
comment
Наконец, я сделал это, передав номер index свойству keyEquivalent каждого NSMenuItem во время создания. ;-) - person Dr.Kameleon; 19.04.2012
comment
Это своего рода злоупотребление keyEquivalent. Если вам нужен только индекс, то было бы лучше сохранить индекс как NSNumber, а затем сохранить этот объект NSNumber как representedObject пункта меню. - person Rob Keniger; 19.04.2012