Обработка сообщений первому респонденту в контроллере представления

Должно быть, мне не хватает чего-то простого, но я этого не вижу. Во-первых, настройка:

  • DATreeView, подкласс NSView
  • DATreeViewController, подкласс NSViewController
  • MainMenu.xib имеет экземпляр DATreeViewController, который настроен для загрузки представления из DATreeView.xib
  • MainMenu.xib также имеет экземпляр DendreaAppDelegate, который имеет розетку DATreeViewController (которая подключена к экземпляру MainMenu.xib DATreeViewController.
  • Do Something!, пункт меню, настроенный для отправки doSomething: сообщения Первому респонденту.
  • Не случайно у DATreeViewController есть действие под названием doSomething:.

Я хочу, чтобы элемент меню Do Something! запускал действие doSomething: на DATreeViewController, и давайте представим, что я не могу просто установить соединение цель / действие напрямую. Я остановлюсь здесь и спрошу, а мой дизайн полностью неправильный? Может ли то, что я пытаюсь сделать, глупо / зло / посрамить меня в глазах моего Бога?

Нет? Здорово. Теперь, хоть убей, я не могу активировать пункт меню. Я делаю это на Snow Leopard, если это имеет значение.

Чтобы добиться хорошей интеграции между NSView и NSViewController, например управляя цепочкой респондентов, я следил за Пример Мэтта Галлахера, с одним существенным изменением: ни в какой момент в процессе загрузки NIB NSView, похоже, не получает сообщение setViewController:, поэтому я отправляю это сообщение сам в сообщении DATreeViewController loadView. Насколько я могу судить, после выполнения следующего кода в applicationDidFinishLaunching:

NSView *view = self.treeViewController.view;
[self.window.contentView addSubview:view];

цепочка респондентов настроена должным образом, то есть:

NSWindow < NSView < DATreeViewController < DATreeView

Я ожидал, что поскольку DATreeViewController является частью цепочки респондентов, и поскольку он отвечает на doSomething:, и поскольку он не реализует проверку, все, что мне нужно было сделать, это использовать Interface Builder для подключения пункта меню Do Something! к Прокси-сервер First Responder с doSomething: в качестве действия, и пункт меню будет активен автоматически.

Что я делаю неправильно? Всем спасибо за неоценимую помощь!


person Cody Brimhall    schedule 01.10.2009    source источник


Ответы (3)


Принимает ли ваше мнение и успешно ли он стал первым откликнуться?

person Peter Hosey    schedule 01.10.2009
comment
Ах! Поскольку действие было в контроллере представления, я переопределил -acceptsFirstResponder. Но контроллер представления не входит в иерархию представления! Спасибо! - person Cody Brimhall; 01.10.2009

Подключен ли DATreeViewController к выходу viewController DATreeView в IB?

Вы проследили через setViewController: и setNextResponder:, чтобы убедиться, что nextResponder настроен правильно?

person Darren    schedule 01.10.2009
comment
Оказывается, все было проще. Поскольку действие находится в контроллере представления, я переопределил -acceptsFirstResponder. Но Какао смотрит только на иерархию представлений для ответчика, а DAView не принимает первого респондента ... - person Cody Brimhall; 01.10.2009

Цепочка респондентов работает только для сообщений в суперклассе NSResponder, таком как mouseDown mouseExited и т. Д. Я считаю, что вы можете сделать что-нибудь хитрое, добавив категорию в NSResponder, чтобы задействовать другие методы, глядя на nextResponder и отправляя сообщение, если nextResponder существует.

Похоже, это пример этой техники: https://github.com/MrNoodle/NoodleKit/blob/master/NSResponder-NoodleModalExtensions.m

person Daniel Wabyick    schedule 26.04.2016