Почему я не могу подключить свое меню к моему контроллеру представления IBAction?
Потому что ваши пункты меню и контроллер представления находятся в разных сценах в раскадровке. Вы можете думать о сцене как о независимом графе объектов, которые создаются, когда сцена загружается из раскадровки. Объекты в разных сценах нельзя соединить в раскадровке, потому что они не загружаются одновременно.
Ради интереса попробуйте создать экземпляр вашего контроллера представления в Application Scene вашей раскадровки. Для этого вам, вероятно, потребуется перетащить старый добрый экземпляр NSObject
в сцену, а затем установить его тип. Как только вы это сделаете, вы обнаружите, что вы можете перетаскивать соединение из пункта меню в этот контроллер представления, как вы и ожидали, но вы не можете перетаскивать соединение с другим объектом того же типа в другом месте. сцена.
Примечание. После того, как вы достаточно наигрались, чтобы убедиться, что это работает, не забудьте удалить добавленный контроллер представления. Контроллер представления без представления подобен утке без шарлатана, а контроллер представления и его иерархия представлений должны находиться в своей собственной сцене.
Мои 2 цента предполагают, что это связано с тем, что приложение основано на документах.
Нет, это не имеет к этому никакого отношения. У вас будет та же проблема в приложении, которое не основано на документах. У вас также была бы та же проблема, если бы ваше приложение было основано на .xib, а не на раскадровках, поскольку контроллер, к которому вы пытаетесь подключиться, находился бы в совершенно другом файле .xib.
Простое решение, как уже описал Марк, — использовать цепочку респондеров. Прокси-объект First Responder является частью каждой сцены, поэтому вы всегда можете подключиться к нему. Когда вы подключаете элемент меню к первому ответчику, его целью будет nil
, что говорит NSMenu
обходить цепочку ответчика, пока не будет найден объект, который отвечает на сообщение о действии пункта меню. Затем он отправляет сообщение этому объекту.
person
Caleb
schedule
23.02.2015