Почему только для некоторых действий я должен вызвать setTarget? - PullRequest
2 голосов
/ 27 марта 2010

Для большинства действий я просто щелкаю и перетаскиваю InterfaceBuilder, чтобы «связать» вызов некоторого интерфейсного объекта с моим кодом. Например, если я хочу знать, когда пользователь щелкает строку в таблице одним щелчком мыши, я перетаскиваю соединение из действия таблицы в действие моего контроллера.

Но теперь давайте рассмотрим, как пользователь дважды щелкнул строку. Если я хочу, чтобы одно из моих действий было вызвано, когда это произойдет, мне нужно позвонить не только -[NSTableView setDoubleAction], но и -[NSControl setTarget]. Почему?

Чтобы было ясно, я не спрашиваю, почему Interface Builder не поддерживает setDoubleAction. Все инструменты имеют ограничения. Я пытаюсь лучше понять, как и почему setTarget не требуется, если и пока я не хочу, чтобы setDoubleAction работал. Другой способ задать этот вопрос: почему мне не нужно ничего делать в Интерфейсном Разработчике, чтобы установить цель действия таблицы (в один клик)?

Ответы [ 2 ]

1 голос
/ 27 марта 2010

Если вы установите действие (или действие двойного щелчка) и не установите цель (или установите цель на nil), то сообщение действия будет проходить через цепочку респондента.

Если вы установите цель в дополнение к действию, сообщение о действии будет направлено только на этот объект.

1 голос
/ 27 марта 2010

Если вы подключите табличное представление к действию в IB, а затем вызовите setDoubleAction для него, больше не нужно делать дополнительный вызов к setTarget. Однако, если вы хотите получить только сообщение двойного щелчка, и вы не подключили табличное представление к действию в IB, вам придется позвонить setTarget.

Представление таблицы отправит action и doubleAction к одной и той же цели. Вы можете представить себе, что NSTableView реализован так:

@implementation NSTableView

- (void)theUserClickedOnMe
{
   [self sendAction:[self action] to:[self target];
}

- (void)theUserDoubleClickedOnMe
{
   [self sendAction:[self doubleAction] to:[self target]];
}

@end

А то, что вы делаете в IB, выглядит примерно так:

- (void)userConnectedControl:(NSControl *)control
        toAction:(SEL)action
        ofObject:(id)object
{
   [control setTarget:object];
   [control setAction:action];
}

Реальные реализации не близки к этому, но это фактически то, что происходит.

...