пятница, 1 мая 2009 г.

1.05.09. The Target-Action Mechanism.

Механизм, связывающий событие в контроле GUI и инструкцию по его обработке в некотором другом объекте.

Событие гененерирует cell, в котором размещен контрол. Ловит событие (т.е. сообщение о нем) target, его обработчик события - это action.

Cell обладает информацией о том, как сгенерировать и послать событие. Также она содержит в виде outlet-а информацию о target-е.

Этот outlet может иметь значение nil. В этом случае обработчик события может быть назначен или определен в процессе работы программ. В качестве обработчика подойдет любой объект, у коротого есть реализация нужного метода. Поиск объекта ведет NSApplication.

Определение объекта-обработчика идет по следующей последовательности:

  1. Проверяется, т.е. ищется подходящий метод, у first responder-а в key window (окно, которое реагирует на нажатия клавиш и сообщения от меню и диалогов). От first responder с помощью nextResponder перемещаемся по цепочке responder-ов до класса окна NSWindow.
  2. Проверяется NSWindow и его делегат.
  3. Если главное окно не совпадает с key window, то проверяется цепочка от first responder до NSWindow и делегата главного окна.
  4. Последним объектом для поиска является объект приложения и его делегат.

Контролы не являются владельцами 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:)];

Комментариев нет:

Отправить комментарий