Обработка сообщений первому респонденту в контроллере представления - PullRequest
2 голосов
/ 01 октября 2009

Я, должно быть, упускаю что-то простое, но не вижу этого. Сначала настройка:

  • 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! к прокси-серверу первого ответчика, используя doSomething: в качестве его действия, и пункт меню будет активен автоматически.

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

Ответы [ 3 ]

3 голосов
/ 01 октября 2009

Ваш взгляд принимает и успешно стал первым респондентом?

0 голосов
/ 27 апреля 2016

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

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

0 голосов
/ 01 октября 2009

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

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

...