Подтвердить что ты не робот

"Первый ответчик". Правильно ли я понял?

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

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

Итак, первый ответчик всегда устанавливает "ссылку" на элемент управления пользовательского интерфейса, который имеет фокус. Правильно ли это?

4b9b3361

Ответ 1

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

"Первый ответчик" в NibFile - это объект...

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

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

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

Итак, если пользователь klicks в элементе управления UI, набор Nib...

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

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

Ваш второй и третий параграфы верны.

Ответ 2

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

Ответ 3

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

http://cocoadev.com/FirstResponder

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

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

Ответ 4

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