Это действительно зависит от архитектуры вашего приложения.Как правило, выполняйте действия везде, где они имеют смысл.В этом отношении вам помогает цепочка респондентов для сообщений действий.
Если ваше приложение не основано на документах, цепочка респондентов для сообщений действий выглядит следующим образом:
- Какой бы респондент не былпервый респондент
- Просмотр иерархии
- Окно
- Контроллер окна
- Делегат окна
NSApp
- Приложениеделегат
Я использую действия в делегате приложения, только если они действительно глобальные для всего приложения.В противном случае я помещаю их в контроллер окна (который обычно также является делегатом окна), если они имеют смысл для конкретного окна, или в контроллер представления, если они имеют смысл для конкретного представления.
Стоит упомянутьчто контроллеры представления (подклассы NSViewController
) не вставляются автоматически в цепочку респондента.Я делаю это вручную после добавления соответствующего представления в суперпредставление.Например, в подклассе NSViewController
:
NSResponder *nextResponder = [[self view] nextResponder];
[[self view] setNextResponder:self];
[self setNextResponder:nextResponder];
Это вставит self
(экземпляр подкласса NSViewController
) в цепочку респондента между представлением и следующим респондентом исходного представления.
Обратите внимание, что в вашем третьем подходе нет ничего неправильного, а именно наличие конкретной цели (подмножество) сообщений действий.Цепочка респондента существует, чтобы дать возможность различным объектам обрабатывать сообщения действий, потому что некоторые действия могут зависеть от контекста.Например, действия в меню «Файл» обычно применяются к окну, которое в настоящее время является главным окном, поэтому имеет смысл не указывать конкретную цель и вместо этого использовать цепочку респондента.С другой стороны, действия в меню ApplicationName действительно глобальны - им не нужно проходить через цепочку респондента, поэтому вы можете подключить их к определенной цели.