«Первый ответчик» - я правильно понял? - PullRequest
31 голосов
/ 28 февраля 2009

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

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

Таким образом, First Responder всегда устанавливает «связь» с элементом управления UI, который имеет фокус. Это верно?

Ответы [ 4 ]

42 голосов
/ 28 февраля 2009

Правильная общая картина, неправильные детали реализации в первом абзаце.

«Первым ответчиком» в NibFile является объект…

Нет, вообще-то, первый ответчик - nil. Подключение элемента управления пользовательского интерфейса (например, кнопки) к First Responder в наконечнике эквивалентно [control setTarget:nil] в коде.

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

Конечно, вы не можете использовать это для установки чего-либо еще на nil, только для просмотра целей. Вы можете использовать его только для обозначения «Первый ответчик», а не для чего-либо еще.

Так что, если пользователь нажимает на элемент управления пользовательского интерфейса, Nib устанавливает ...

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

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

Ваш второй и третий абзацы верны.

3 голосов
/ 28 февраля 2009

Ваше понимание неполно. Цепочка респондента включает в себя больше, чем то, что мы обычно называем «элементами управления пользовательским интерфейсом», включая, что наиболее важно, текущий документ. Одним из больших преимуществ является то, что он позволяет вам взаимодействовать с концептуально «текущим» чем угодно - текущим окном, текущим текстовым полем, текущим документом и т. Д. - без особых хлопот по его поиску.

2 голосов
/ 26 декабря 2009

Респондентом является любой объект, который будет выполнять действия (вызывать функции) при возникновении событий (например, нажатия на кнопки). Цепочка респондента представляет собой последовательность объектов, каждый из которых содержится друг в друге - например, кнопка внутри панели внутри окна. Когда происходит событие, мы выполняем итерацию по цепочке до тех пор, пока не найдем объект, для которого респондент не установлен в nil и который поэтому может ответить на событие. Таким образом, вместо предоставления объекта респондента для каждой кнопки в окне, мы можем предоставить один респондент для всего окна. Первый респондент - это просто первый объект в цепочке респондента - связывание события с первым респондентом позволяет событию пройти по цепочке.

2 голосов
/ 28 февраля 2009

Проверьте эту ссылку, она хорошо объясняет. Я думаю, у вас есть суть этого:

http://cocoadev.com/FirstResponder

Из источника:

FirstResponder - первый объект в цепочке респондента, которая дается возможность ответить на событие.

...