2013-02-08 3 views
0

У меня есть NSPopUpButton, что я получил подклассы, которые планирую использовать в нескольких местах в моей программе. Это подклассы, потому что у него есть специальные функции.Выполнение моих сообщений перехвата подкласса

Обычно для получения событий событий вы создаете метод в классе контроллера и затем соединяете его с конструктором интерфейса для обработки действия. Например, если пользователь изменил одну из опций в NSPopUpButton, он отправил сообщение методу действия конструктора интерфейса, например, ниже.

- (IBAction)sourcePopUpMenuChanged:(id)sender { 
    NSLog(@"sourcePopUpMenuChanged"); 
} 

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

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

Есть ли способ, чтобы, если ЛЮБЫЕ УСТАНОВКИ моего контроля получают сообщение «Действие», я могу запустить какой-то код, например, как установить глобальную переменную для gIndex = PopUpMenu Index Selected.

Помощь очень ценится!

+1

В вашем проекте не должно быть глобальных переменных. – Sven

+0

Если глобальных переменных не должно быть, то что должно быть? Кроме того, я работаю с базой кода, на которой у меня нет большого контроля, все в программе основано на старой программе на C, которую я переношу на Cocoa. Он сильно полагался на логику глобальных переменных, поэтому я как бы застрял в этом. Я открыт для других предложений. Я скопировал глобальные переменные в файл заголовка и дал команду extern каждому, чтобы я мог их использовать. –

+1

Я вижу. Таким образом, вы не можете легко избавиться от всех глобалов сразу. Моя рекомендация заключалась бы в том, чтобы инкапсулировать глобалы в класс и получить к ним доступ из нового кода только через экземпляр этого класса. Затем вы можете постепенно адаптировать свой существующий код для использования этого класса, пока вы не сможете удалить глобальную переменную и вместо этого использовать свойство своего объекта. (Разумеется, вы должны поместить все глобалы в один класс) – Sven

ответ

4

Чтобы ответить на ваш вопрос, вы можете переопределить метод sendAction:to: на свой подкласс NSPopUpButton, чтобы сделать свой материал. Просто не забудьте позвонить super, чтобы сообщение о действии было перенаправлено на обычный приемник.

Когда управляющий хочет отправить формируемое действие она использует sendAction:to: метод, который вызывает sendAction:to:from: на NSApp (единственный NSApplication экземпляр). Этот метод следует цепочке ответчиков, чтобы найти конечного получателя сообщения о действии.

+0

Спасибо, что это сработало! –

Смежные вопросы