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

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

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

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

4 ответов


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

"первым ответчиком" в файле NibFile является объект ...

нет, на самом деле, первым ответчиком является nil. Подключение элемента управления UI (например, кнопки) к первому ответчику в nib эквивалентно [control setTarget:nil] в коде.

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

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

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

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

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

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


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


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


проверьте эту ссылку, она хорошо объясняет. Я думаю, вы уловили суть:--1-->

http://cocoadev.com/FirstResponder

источник

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