2011-12-26 4 views
0

В моем приложении Cocoa в меню приложения есть пункт меню «Удалить», который отправляет сообщение delete: первому ответчику. Теперь у меня есть фокус клавиатуры на NSOutlineView, который является первым ответчиком в этом случае. За исключением подкласса NSOutlineView, есть ли способ обработать сообщение delete:, переданное ему? Ни NSOutlineViewDelegate, ни протокол NSOutlineViewDataSource, по-видимому, не определяют ничего интересного для обработки этих действий.Есть ли такая вещь, как делегат NSResponder?

+0

Как вы возражаете против подкласса? Это просто и достигнет того, чего вы хотите. –

+0

Это, безусловно, достигает результата, однако обработка этих элементов-клещей, по-видимому, является ролью контроллера вместо представления. Кроме того, поскольку Cocoa активно выступает за шаблон делегата, я подумал, что, возможно, есть какой-то встроенный делегат для решения этих задач. – Tony

ответ

2

Первый ответчик в точности такой: первый ответчик. Он пересылает все, что не интересует его , следующего ответчика, и может пересылать его по очереди и так далее, пока сообщение не достигнет объекта приложения.

Итак, все, что вам нужно сделать, чтобы справиться с этим сообщением, находится в цепочке ответчиков. Контроллер окна - хороший способ сделать это; это будет следующий ответчик окна.

См. “Event Architecture” in the Event-Handling Guide.

+1

С точки зрения архитектуры, не кажется ли бесполезным, чтобы обработчики окон обрабатывали события «копировать», «вставлять» и «удалять», которые являются локальными для представления таблицы/контура? Кажется, что эти методы лучше всего обрабатываются либо контроллером массива/дерева, с которым привязывается представление, либо делегатом представления, но NSArrayController и NSTreeController не являются NSR-ответчиками и не могут находиться внутри цепочки ответчиков, какие-либо предложения? – Tony

+1

Вы всегда можете использовать пользовательские объекты NSViewController для управления каждым из ваших индивидуальных представлений и вставки контроллеров представления в цепочку ответчиков. Контроллеры представлений могут обрабатывать копии и вставки и т. Д. –

+0

@Tony: нет, если оконный контроллер является или знает объект, которому принадлежат данные (например, документ). Контроллеры окон в значительной степени существуют для промежуточного между представлениями и окном и контроллерами модели. Было бы лучше, если бы представление обрабатывало вырезание, копирование, вставку и удаление себя (либо через привязку, либо с сообщениями с источниками данных), но если вы не хотите сделать подкласс, который добавляет это, это не так. –

Смежные вопросы