Механизм, связывающий событие в контроле GUI и инструкцию по его обработке в некотором другом объекте.
Событие гененерирует cell, в котором размещен контрол. Ловит событие (т.е. сообщение о нем) target, его обработчик события - это action.
Cell обладает информацией о том, как сгенерировать и послать событие. Также она содержит в виде outlet-а информацию о target-е.
Этот outlet может иметь значение nil. В этом случае обработчик события может быть назначен или определен в процессе работы программ. В качестве обработчика подойдет любой объект, у коротого есть реализация нужного метода. Поиск объекта ведет NSApplication.
Определение объекта-обработчика идет по следующей последовательности:
- Проверяется, т.е. ищется подходящий метод, у first responder-а в key window (окно, которое реагирует на нажатия клавиш и сообщения от меню и диалогов). От first responder с помощью nextResponder перемещаемся по цепочке responder-ов до класса окна NSWindow.
- Проверяется NSWindow и его делегат.
- Если главное окно не совпадает с key window, то проверяется цепочка от first responder до NSWindow и делегата главного окна.
- Последним объектом для поиска является объект приложения и его делегат.
Контролы не являются владельцами target-ов также, как хост-классы не являются владельцами делегатов и источников данных. Их владельцами дожны быть клиенты контролов и хост-классов.
Action - это и сообщение, отправляемое контролом target-у и метод-обработчик target-а.
Cell содержит действия в виде переменных типа SEL (указатель на функцию).
Сигнатура сообщения для действия в cell:
- (IBAction) deleteRecord:(id)sender;
IBAction - это void для IB.
Для того, чтобы разгрузить контрол в ячейки перенесена некоторая работа из контрола, например, вся работа по реализации механизма target-action.
NSMatrix может содержать несколько ячеек.
NSCell - абстрактный класс. NSActionCell - конкретный класс, содержащий переменные для target и action.
Ячейка также обычно ответственна за отображение контрола, например, она подсвечивает его, когда над ним проводится курсор.
Иногда, как например у NSMenuItem, ячейка не используется и необходимые переменные содержатся сразу в контроле.
Для программной установки target и action:
- (void)setTarget:(id)anObject;
- (void)setAction:(SEL)aSelector;
Примеры:
[aCell setTarget:myController];
[aControl setAction:@selector(deleteRecord:)];
[aMenuItem setAction:@selector(showGuides:)];
Комментариев нет:
Отправить комментарий