Действие без цели — это пара "цель-действие", в которой цель оказывается пустой (nil). Это означает, что целевой объект для такого действия заранее не назначен.

Вместо этого соблюдается следующее правило: начиная с представления проверки касания (т.е. представления, с которым взаимодействует пользователь), в среде Cocoa осуществляется поиск вверх по цепочке реагирующих элементов объекта, способного отреагировать на сообщение о действии. Допустим, что в прикладном коде настраивается кнопка, как показано ниже.

self.button addTarget:nil action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

Это и есть действие без цели. Так что же произойдет, если пользователь нажмет кнопку? Прежде всего в среде Cocoa будет проверено, сможет ли сам объект типа UIButton отреагировать на сообщение buttonPressed:. Если не сможет, то поиск продолжится в родительском представлении типа UlView этого объекта, и так далее вверх по цепочке реагирующих элементов. Если реагирующий элемент, способный обработать событие нажатия кнопки, будет найден, сообщение о действии посылается данному объекту, а иначе оно остается необработанным (без всяких взысканий).

Таким образом, в упоминавшемся ранее приложении, где ссылка self обозначает контроллер, владеющий представлением, содержащим кнопку, а в классе этого контроллера фактически реализуется метод buttonPressed:, нажатие кнопки приведет к вызову метода buttonPressed:!

Для того чтобы создать действие без цели в nib-файле, следует установить соединение с прокси-объектом первого реагирующего элемента в стыковочном блоке. Именно для этой цели и предназначен данный объект! Первый реагирующий элемент не является настоящим объектом с известным классом, поэтому, прежде чем устанавливать связь между ним и действием, придется определить сообщение о действии в прокси-объекте первого реагирующего элемента следующим образом.

1. Выберите прокси-объект первого реагирующего элемента в nib-файле и перейдите к инспектору атрибутов.

2. Появится (возможно, пустая) таблица с определяемыми пользователем действиями без цели первого реагирующего элемента. Щелкните на кнопке Plus и присвойте сигнатуру новому действию. Она должна принимать единственный параметр, а следовательно, завершаться двоеточием.

3. Нажмите клавишу <Control> и перетащите курсор от элемента управления (в данном случае — кнопки типа UIButton) к прокси-объекту первого реагирующего элемента, чтобы указать пустонацеленное действие с указанной сигнатурой.

 

Применение понятия первый реагирующий элемент в среде Cocoa кажется не совсем понятным. Так, объекту произвольного реагирующего эле-мента можно присвоить состояние формально первого реагирующего элемента, послав ему сообщение becomeFirstResponder, при условии, что этот реагирующий элемент возвращает логическое значение YES из метода canBecomeFirstResponder. Вследствие этого объект не становится первым реагирующим элементов для обработки действий без цели! Поиски в среде Cocoa реагирующего элемента, способного обработать действие без цели, начинаются с того элемента управления, с которым пользователь взаимодействует (через представление проверки касания), а затем продолжается вверх по цепочке реагирующих элементов.


 

 

 

Добавить комментарий