Почему я не могу подключить свое меню к моему контроллеру просмотра IBAction?
У меня есть приложение на основе документа. Я только что создал пункты меню в раскадровке и IBActions в моем контроллере. Однако обычный способ подключения объекта к цели не работает.
-(IBAction) markAsHidden:(id)sender;
-(IBAction) markAsVisible:(id)sender;
-(IBAction) toggleHidden:(id)sender;
Вот что я вижу, когда из своего пункта меню я нажимаю Ctrl и нажимаю кнопку мыши в меню View Controller. Он не показывает мои IBActions.
Любая идея? Мои 2 цента предполагают, что это связано с тем, что приложение основано на документе, но... не совсем уверен
Почему я не могу подключить свое меню к моему контроллеру просмотра IBAction?
Поскольку ваши пункты меню и контроллер просмотра находятся в разных сценах в раскадровке. Вы можете представить сцену как независимый график объектов, которые создаются при загрузке сцены из раскадровки. Объекты в разных сценах не могут быть соединены вместе в раскадровке, потому что они не загружаются одновременно.
Просто для удовольствия попробуйте создать экземпляр вашего контроллера вида в приложении Scene в своем раскадровке. Для этого вам, вероятно, придется перетащить простой старинный экземпляр NSObject
в сцену, а затем установить его тип. Как только вы это сделаете, вы обнаружите, что вы можете перетащить соединение из элемента меню в этот контроллер представления так же, как и следовало ожидать, но вы не можете перетащить соединение к другому объекту того же типа в другом сцены.
Примечание. После того, как вы сыграли достаточно, чтобы убедить себя, что он работает, не забудьте удалить добавленный контроллер просмотра. Контроллер представления без представления похож на утку без шарлата, а контроллер вида и его иерархия представлений должны находиться в их собственной сцене.
Мои 2 цента предполагают, что это связано с тем, что приложение основано на документе
Нет, это не имеет никакого отношения к этому. У вас будет такая же проблема в приложении, которое не основано на документах. У вас также будет такая же проблема, если ваше приложение было основано на xix вместо использования раскадровки, так как контроллер, с которым вы пытаетесь подключиться, был бы в совершенно другом .xib файле.
Простое решение, как уже отмечал Марк, - использовать цепочку ответчиков. Прокси-объект First Responder является частью каждой сцены, поэтому вы всегда можете подключиться к нему. Когда вы подключаете элемент меню к первому ответчику, его цель будет nil
, которая сообщает NSMenu
, чтобы пройти цепочку ответчиков, пока не найдет объект, который отвечает на сообщение о действии пункта меню. Затем он отправляет сообщение этому объекту.
Подключить элементы меню к сценарию приложения Первый ответчик. Когда вы подключаетесь к сценарию приложения First Responder, ваш контроллер просмотра IBActions должен появиться в списке доступных HUD-действий вместо сетов действия, показанных на вашем снимке экрана HUD.
Если вы конвертируете проект из объективного C в Swift, не делайте мою ошибку. При написании своего IBAction напишите вот так:
@IBAction func someAction(_ sender:AnyObject) {
// this will work
}
Не опускайте знак подчеркивания до sender
, или Интерфейс Builder не сможет подключиться к вашему действию, как здесь:
@IBAction func someAction(sender:AnyObject) {
// this won't work and IB won't connect to this action
// because sender will be part of the symbol name
}
- Вопросы
- Nsstoryboard
- Почему я не могу подключить свое меню к моему контроллеру просмотра IBAction?