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

Например, дочернее представление может видеть родительское представление через свое свойство superview. Родительское представление может видеть все свои дочерние представления через свое свойство subviews и выбрать конкретное дочернее представление через свойство tag этого дочернего представления, вызвав метод viewWithTag:. Дочернее представление в окне может видеть это окно через свое свойство window. Следовательно, перемещаясь вверх и вниз по иерархии представлений с помощью свойств, можно получить требуемую ссылку.

Ниже приведен пример кода, взятый из одного из моих приложений, где многие кнопки и текстовые поля связаны в пары. Так, если кнопка выбирается постукиванием пальцем по ней, то в соответствующем текстовом поле нужно предоставить текст. Как же получить ссылку на текстовое поле, связанное с выбранной кнопкой? Для этого в nib-файле назначаются дескрипторы кнопок (101,102,103 и т.д.), а также дескрипторы соответствующих им текстовых полей (1, 2, 3 и т.д.).

UlView* v = sender; // кнопка

UlView* v2 = [v.superview viewWithTag:(v.tag - 100)];

Аналогично один реагирующий элемент (см. главу 11) может видеть следующий реагирующий элемент в цепочке посредством метода nextResponder. Это также означает, что благодаря структуре цепочки реагирующих элементов основное преставление контроллера может видеть контроллер преставления. В приведенном ниже фрагменте кода перемещением вверх по иерархии получается ссылка на контроллер преставления, отвечающий за отображение всей сцены в целом.

UIResponder* г = self; // представление типа UlView в интерфейсе

while (![r isKindOfClass:[UlViewController class]]) г = г.nextResponder;

Аналогично контроллеры представлений сами являются частью иерархии вложенности и поэтому могут видеть друг друга. Если один контроллер представления предоставляет представление через второй контроллер представления, то последний является для первого контроллером типа presentedViewController, а первый для последнего — контроллером типа presentingViewController. Если же контроллер представления вложен в контроллер типа UINavigationController, то последний является для первого контроллером типа navigationController. Управление видимым представлением контроллера типа UINavigationController осуществляется его контроллером типа visibleViewController. Кроме того, из любого из этих контроллеров представлений можно достигнуть нужного представления через его свойство view.

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


 

 

 

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