Почему я не могу подключить свое меню к моему контроллеру просмотра IBAction?

89
8

У меня есть приложение на основе документа. Я только что создал пункты меню в раскадровке и IBActions в моем контроллере. Однако обычный способ подключения объекта к цели не работает.


-(IBAction) markAsHidden:(id)sender;
-(IBAction) markAsVisible:(id)sender;
-(IBAction) toggleHidden:(id)sender;

Вот что я вижу, когда из своего пункта меню я нажимаю Ctrl и нажимаю кнопку мыши в меню View Controller. Он не показывает мои IBActions.


Любая идея? Мои 2 цента предполагают, что это связано с тем, что приложение основано на документе, но... не совсем уверен


connection menu

спросил(а) 2015-02-22T14:01:00+03:00 4 года, 9 месяцев назад
3
Решение
99

Почему я не могу подключить свое меню к моему контроллеру просмотра IBAction?



Поскольку ваши пункты меню и контроллер просмотра находятся в разных сценах в раскадровке. Вы можете представить сцену как независимый график объектов, которые создаются при загрузке сцены из раскадровки. Объекты в разных сценах не могут быть соединены вместе в раскадровке, потому что они не загружаются одновременно.


Просто для удовольствия попробуйте создать экземпляр вашего контроллера вида в приложении Scene в своем раскадровке. Для этого вам, вероятно, придется перетащить простой старинный экземпляр NSObject в сцену, а затем установить его тип. Как только вы это сделаете, вы обнаружите, что вы можете перетащить соединение из элемента меню в этот контроллер представления так же, как и следовало ожидать, но вы не можете перетащить соединение к другому объекту того же типа в другом сцены.


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

Мои 2 цента предполагают, что это связано с тем, что приложение основано на документе



Нет, это не имеет никакого отношения к этому. У вас будет такая же проблема в приложении, которое не основано на документах. У вас также будет такая же проблема, если ваше приложение было основано на xix вместо использования раскадровки, так как контроллер, с которым вы пытаетесь подключиться, был бы в совершенно другом .xib файле.


Простое решение, как уже отмечал Марк, - использовать цепочку ответчиков. Прокси-объект First Responder является частью каждой сцены, поэтому вы всегда можете подключиться к нему. Когда вы подключаете элемент меню к первому ответчику, его цель будет nil, которая сообщает NSMenu, чтобы пройти цепочку ответчиков, пока не найдет объект, который отвечает на сообщение о действии пункта меню. Затем он отправляет сообщение этому объекту.

ответил(а) 2015-02-23T23:39:00+03:00 4 года, 9 месяцев назад
Еще 2 ответа
127

Подключить элементы меню к сценарию приложения Первый ответчик. Когда вы подключаетесь к сценарию приложения First Responder, ваш контроллер просмотра IBActions должен появиться в списке доступных HUD-действий вместо сетов действия, показанных на вашем снимке экрана HUD.

ответил(а) 2015-02-23T22:04:00+03:00 4 года, 9 месяцев назад
56

Если вы конвертируете проект из объективного 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
}

ответил(а) 2016-12-28T16:07:00+03:00 2 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема