11

我有一个基于文档的应用程序。我刚刚在我的视图控制器中的情节提要和 IBActions 中创建了菜单项。但是,我将动作连接到目标的通常方式不起作用

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

这是我从菜单项中按 Ctrl 并鼠标从菜单单击到视图控制器时看到的内容。它没有显示我的 IBActions。

任何的想法 ?我的 2 美分猜测是它与基于文档的应用程序有关,但......不太确定

连接菜单

4

3 回答 3

19

将菜单项连接到应用场景的 First Responder。当您连接到应用程序场景的 First Responder 时,您的视图控制器的 IBActions 应该出现在 HUD 的可用操作列表中,而不是屏幕截图的 HUD 中显示的操作序列。

于 2015-02-23T19:04:54.737 回答
11

为什么我不能将我的菜单连接到我的视图控制器 IBAction?

因为您的菜单项和视图控制器位于情节提要的不同场景中。您可以将场景视为从情节提要加载场景时实例化的对象的独立图。不同场景中的对象无法在故事板中连接在一起,因为它们不是同时加载的。

只是为了好玩,尝试在情节提要的应用程序场景中创建视图控制器的实例。为此,您可能需要将一个普通的旧NSObject实例拖到场景中,然后设置其类型。一旦你这样做了,你会发现你可以像你期望的那样将一个连接从一个菜单项拖到那个视图控制器,但是你不能把一个连接拖到一个不同的相同类型的对象上。场景。

注意:一旦你玩了足够多的时间来说服自己它可以工作,记得删除你添加的视图控制器。没有视图的视图控制器就像没有嘎嘎的鸭子,视图控制器及其视图层次结构应该在自己的场景中。

我的 2 美分猜测是它与基于文档的应用程序有关

不,这与它没有任何关系。在不基于文档的应用程序中,您也会遇到同样的问题。如果您的应用程序基于 .xib 而不是使用情节提要,您也会遇到同样的问题,因为您尝试连接的控制器将位于完全不同的 .xib 文件中。

正如 Mark 已经描述的那样,简单的解决方案是使用响应者链。First Responder代理对象是每个场景的一部分,因此您可以随时与它建立联系。当您将菜单项连接到 First Responder 时,它的目标将是nil,它告诉NSMenu响应者链遍历,直到找到响应菜单项的操作消息的对象。然后它将消息发送到该对象。

于 2015-02-23T20:39:39.337 回答
2

如果您要将项目从目标 C 转换为 Swift,请不要犯我的错误。在编写您的 IBAction 时,请这样写:

 @IBAction func someAction(_ sender:AnyObject) {
     // this will work
 }

不要在前面省略下划线,sender否则 Interface 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-28T13:07:47.913 回答