Кроме связей выходов в nib-файле существуют связи действий. Связь действия, как и связь выхода, — это способ, позволяющий одному объекту в nib-файле ссылаться на другой объект.

Действие (action) — это сообщение, автоматически генерируемое интерфейсным объектом класса UlControl (элементом управления) из каркаса Cocoa и посылаемое другому объекту, когда пользователь что-то делает, например щелкает на кнопке. В ответ на разные действия пользователя заставляют элемент управления генерировать сообщения, которые называются событиями. Для того чтобы увидеть список возможных событий, прочитайте описание класса UlControl в документации в разделе “Control Events.” Например, если пользователь щелкает на кнопке, генерируется сообщение типа UIControlEventTouchUpInside.

Для того чтобы этот механизм работал, элемент управления должен знать три факта.

  • Чему соответствует элемент управления?
  • Какое сообщение должно посылаться (метод вызова), когда возникает событие, связанное с элементом управления (действием)?
  • Какому объекту должно быть послано сообщение (цель)?

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

Например, сделаем контроллер представлений в нашем проекте Empty Window целью сообщений, связанного с действием и генерируемого событием UIControlEventTouchUpInside (означающим что кнопка была нажата). Нам нужен метод в контроллере представления, который будет вызываться кнопкой после щелчка на ней. Для того чтобы этот метод был более ясным, поместим на котроллер представления окно предупреждения. Вставим этот метод в раздел реализации в файле ViewController .т.

- (IBAction) buttonPressed: (id) sender {

UIAlertView* av = [[UIAlertView alloc] initWithTitle:@"Howdy!"

message:@"You tapped me." delegate:nil cancelButtonTitle:@"Cool" otherButtonTitles:nil];

[av show];

}

Терм IBAction напоминает IBOutlet — это подсказка для самой среды Xcode, которая является синтаксически корректной, потому что, хотя среда Xcode может увидеть подсказку в вашем коде, компилятор будет интерпретировать ее как эквивалент void. Он просит среду Xcode сделать этот метод в nib-редакторе селектором сообщения, связанного с действием, если объект класса, в котором этот метод определен, является целью связи действия. Действительно, если посмотреть в nib-редактор, мы увидим, что он теперь доступен: выберите объект View Controller и перейдите в окно инспектора связей, вы увидите, что метод buttonPressed: теперь перечислен в разделе Received Actions.

Как и для связи выхода, создание связи действия представляет собой двухэтапный процесс. Мы уже выполнили первый этап: определили метод действия. Однако мы еще ничего не сделали для того, чтобы nib-файл вызвал этот метод. Для того чтобы это стало возможным, необходимо выполнить следующие действия.

  1. Перейдите в окно инспектора связей контроллера View Controller и проведите соединительную линию от кружка справа от сообщения buttonPressed: к кнопке. Отпустите кнопку мыши.
  2. В индикаторе HUD появится список, связанных с элементами управлениями. Щелкните на кнопке Touch Up Inside.

Теперь связь действия создана. Это значит, что при выполнении приложения в любой момент, когда кнопка получает событие Touch Up Inside, т.е. когда она будет нажата, она будет посылать сообщение buttonPressed: цели, которая представляет собой контроллер представления. Мы знаем, что этот метод должен делать: он должен выводить на экран окно предупреждения. Попробуйте! Соберите и выполните приложение, а затем, когда оно будет выполняться симулятором, щелкните на кнопке. Она работает!

Как и связи выхода, связи действия можно создавать многими способами. Эти способы очень похожи на способы создания связей выхода. Например, если в файле ViewController .ш уже создан метод действия, связь действия можно создать следующим образом.

  • Нажмите клавишу <Control> и щелкните на контроллере представления. На экране появится индикатор HUD, напоминающий инспектор связей. Действуйте так, как указано в предыдущем разделе.
  • Выберите кнопку и перейдите в окно инспектора связей. Проведите соединительную линию от кружка Touch Up Inside к контроллеру представления. На экране появится индикатор HUD, в котором перечислены известные методы действия в контроллере представления; щелкните на пункте buttonPressed:.
  • Нажмите клавишу <Control> и щелкните кнопкой мыши. На экране появится индикатор HUD, напоминающий инспектор связей. Действуйте так, как указано в предыдущем разделе.

 

Кроме того, можно создать связь между редактором кода и nib-редактором. Откройте файл ViewController ,ш в одном окне и раскадровку в другом. Слева от метода buttonPressed: в файле ViewController ,ш на поле расположен кружок. Вы можете провести соединительную линию от этого кружка через границу окна на кнопку в nib-редакторе.

Как и в случае связи выхода, самым впечатляющим является создание связи действия с помощью проведения соединительной линии из nib-редактора в ваш код, вставки метода действия и создания связи действия в nib-файле за один шаг. Попробуйте выполнить эту процедуру, предварительно удалив метод buttonPressed: из своего кода, чтобы в nib-файле не было связи действия.

  1. Нажмите клавишу <Control> и проведите соединительную линию из nib-редактора на пустую область в разделе @implementation файла ViewController .ш. На экране появится индикатор HUD, содержащий команду Insert Action. Отпустите кнопку мыши.
  2. На экране появится всплывающее меню, в котором можно конфигурировать метод действия, который мы создаем. Назовите его buttonPressed:, убедитесь, что пункт Event настроен на Touch Up Inside (по умолчанию), и щелкните на кнопке Connect.

Среда Xcode создала шаблонный метод и формирует соответствующее действие в nib-файле за один шаг:

 

- (IBAction)buttonPressed:(id)sender { )

 

Этот метод — просто шаблон (среда Xcode не может прочитать ваши мысли и угадать, что этот метод должен делать), поэтому в реальной жизни вам придется заполнить пространство между фигурными скобками определенным кодом.

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

 

Связи между nib-файлами

Невозможно провести связь выхода или действия между объектом в одном nib-файле и объектом в другом nib-файле или (в раскадровке) между объектом в одной сцене и объектом в другой сцене. Если вы думаете, что это возможно, значит, вы не понимаете, что такое nib-файл (а также сцена или связь). Причина проста: в момент загрузки nlb-файла все объекты в nib-файле одновременно становятся экземплярами, поэтому имеет смысл связывать их друг с другом в рамках одного и того же nlb-файла, потому что мы знаем, какие экземпляры возникают при загрузке nlb-файла. Если попробовать провести связь выхода или действия от объекта в одном nlb-файле к объекту в другом nib-файле, невозможно понять, какие реально существующие экземпляры будут связаны друг с другом, потому что разные nlb-файлы загружаются в разные моменты времени (если вообще загружаются). Проблема связи между экземплярами, сгенерированными из разных nib-файлов, является частным случаем более общей проблемы коммуникации экземпляров в рамках программы, которая обсуждается в главе 13.

 

 

Меню Related Files в nib-редакторе содержит действия и выходы, подключенные к объекту, выделенному в данный момент. Это позволяет осуществлять W 4 . быстрый переход к другому концу связи или просто получать информацию ——•>!' о нем. Когда главным окном является окно nib-редактора, окно помощника содержит те же пункты, что и меню Tracking. Таким образом, вы можете, например, выбрать объект интерфейса в nib-редакторе, чтобы увидеть в окне помощника метод действия, с которым он связан.


 

 

 

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