2009-12-28 2 views
1

Я новичок в программировании Obj-C/Cocoa, и у меня возникла проблема с динамическим добавлением элементов меню в экземпляр NSMenu и с селектором действий элементов, уже установленным при вставке ,Добавление элемента в NSMenu с предустановленным селектором действий

Я могу добавить элементы динамического меню в порядке, но селектор действий не запускается, когда элемент щелкнут через меню.

Первая строка ниже - это строка кода, которую я использую для добавления пункта меню. Вы можете установить, что я устанавливаю действие: (SEL) aSelector в функцию «openEchowavesURL».

Эта функция находится в том же файле класса контроллера, и я включил определение функции ниже.

Я просто вызываю неправильный синтаксис селектора или someting? Или что это за трюк, чтобы заставить элемент меню вызвать селектор при нажатии?


[statusMenu insertItemWithTitle:[NSString stringWithFormat:@"%d - %@", convo.newMessagesCount, convo.ewName] action:@selector(openEchowavesURL:) keyEquivalent:@"" atIndex:0]; 

- (void)openEchowavesURL:(id)sender { 
    // function details here 
} 

ответ

11

Если вы хотите, чтобы действие, которое будет вызвано против вашего объекта, вы должны указать цель для нового NSMenuItem:

NSMenuItem *item = [statusMenu insertItemWithTitle:[NSString stringWithFormat:@"%d - %@", convo.newMessagesCount, convo.ewName] action:@selector(openEchowavesURL:) keyEquivalent:@"" atIndex:0]; 
[item setTarget:self]; // or whatever target you want 

Если вы не сделаете это, то NSResponder цепь не будет погулял до объект реагирует на селектор.

+1

спасибо. Итак, если цепочка идет, то почему селектор не найден в моем классе контроллера? Почему в этом случае мне нужно вручную указать «я»? – cpjolicoeur

+1

Вы должны отвечать определенным критериям, чтобы быть опрошенными во время поиска. Я предлагаю вам прочитать следующее руководство, чтобы понять, как: http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/EventOverview/index.html#//apple_ref/doc/uid/10000060i –

+0

Ваш контроллер вероятно, не является частью цепи ответчиков. –

1

действия нужна цель, иначе они будут посланы к нулю, а затем новые правила.

+0

Вы можете объяснить это немного больше? Я не думаю, что я следую. Я устанавливаю действие на селектор, который я хочу, на вставленный элемент меню. Что еще мне нужно сделать для установки цели? – cpjolicoeur

+1

Отправить сообщение setTarget. –

+0

Если вы отправите действие в nil (NULL), тогда будет использоваться первый запросчик (по возможности). В сортировке: чтобы обработать действие самого крайнего окна, установите цель в NULL. В Interface Builder вы добавляете действия в класс FirstResponder, а затем подключаете действия непосредственно к экземпляру firstResponder вместо своих собственных объектов. -Так часто это хорошая идея (особенно для пунктов меню), чтобы установить цель в NULL. Помните, что вы также можете использовать 'createdObject' для хранения ссылок на данные/объекты. – 2014-11-21 01:46:36