我有一个基于文档的应用程序。我刚在故事板中创建了菜单项,在视图控制器中创建了IBActions。但是,将动作连接到目标的常用方法并不起作用
-(IBAction) markAsHidden:(id)sender;
-(IBAction) markAsVisible:(id)sender;
-(IBAction) toggleHidden:(id)sender;
以下是我从菜单项中看到的内容,我按住Ctrl并从菜单中单击鼠标到View Controller。它没有显示我的IBActions。
有什么想法吗?我的2美分猜测是它与基于文档的应用程序有关,但......不太确定
答案 0 :(得分:19)
将菜单项连接到应用程序场景的First Responder。当您连接到应用程序场景的First Responder时,您的视图控制器的IBAction应出现在HUD的可用操作列表中,而不是屏幕截图的HUD中显示的操作segue。
答案 1 :(得分:10)
为什么我无法将菜单连接到我的视图控制器IBAction?
因为您的菜单项和视图控制器位于故事板中的不同场景中。您可以将场景视为从故事板加载场景时实例化的对象的独立图形。不同场景中的对象无法在故事板中连接在一起,因为它们不会同时加载。
只是为了好玩,尝试在故事板中的应用程序场景中创建视图控制器的实例。要做到这一点,您可能需要将普通的旧NSObject
实例拖到场景中,然后设置其类型。完成后,您会发现可以将连接从菜单项拖动到该视图控制器,就像您期望的那样,但是您无法将连接拖到另一个对象中。非常相同的类型在不同的场景中。
注意:一旦你玩得足以让自己相信它有效,请记得删除你添加的视图控制器。没有视图的视图控制器就像没有嘎嘎声的鸭子,视图控制器及其视图层次结构应该在他们自己的场景中。
我的2美分猜测是它与基于文档的应用程序
有关
不,它与此无关。您在应用中遇到的问题与基于文档的问题相同。如果您的应用程序是基于.xib而不是使用故事板,那么您也会遇到同样的问题,因为您尝试连接的控制器将位于完全不同的.xib文件中。
正如Mark所描述的那样,简单的解决方案是使用响应者链。 First Responder 代理对象是每个场景的一部分,因此您始终可以与其建立连接。当您将菜单项连接到First Responder时,其目标将是nil
,它告诉NSMenu
走动响应者链,直到找到响应菜单项的操作消息的对象。然后它将消息发送到该对象。
答案 2 :(得分:2)
如果要将项目从目标C转换为Swift,请不要犯错误。在写这样的IBAction时写这样:
@IBAction func someAction(_ sender:AnyObject) {
// this will work
}
请勿在{{1}} 之前省略下划线,否则Interface Builder将无法连接到您的操作,如下所示:
sender