Jon*_*ber 2 macos xcode cocoa swift
我想在视图控制器中单击菜单项"打开".
它似乎只能在我的AppDelegate中处理它.这里描述的问题[1]与我想做的事情非常相似,但我认为必须有一种更动态的方式,并且不要求AppDelegate知道在哪里转发它.如果我想根据当前视图更改操作,该怎么办?
这是我用cocoa编写的第一个应用程序,所以我还不熟悉'Responder Chains'[2]和'Delegation',但似乎我必须对它们做些什么.
[1] 从AppDelegate(Swift)连接到ViewController
[2] Cocoa Storyboard Responder Chain
如果我想根据当前视图更改操作,该怎么办?
您确实需要了解响应程序链以获取菜单命令的处理方式.简而言之,视图,视图控制器,窗口控制器,文档和应用程序本身都是实例NSResponder,它提供了处理按键和菜单命令等事件的机制.在任何特定时刻都有一个"第一响应者",这是第一个能够处理这类事件的对象.如果该对象不处理有问题的事件,则事件将被传递给链中的下一个响应者,依此类推,直到它到达应用程序.
例如,当您在基于Cocoa的文本编辑器中键入字母"a"时,该按键将被发送到第一个响应者.如果文档窗口打开并处于活动状态,则第一个响应者可能会成为某个文本视图,它将在插入点插入"a",并可能通知其委托者文本已更改.另一方面,如果选择同一窗口激活的文件 - >关闭命令,该事件将从文本视图开始,可能无法处理它,因此它将被传递到超视图,窗口,到窗口控制器,最后到达文件,该文件知道如何处理该命令.另一方面,如果命令是File-> Quit,则命令将在处理之前一直到应用程序.这被称为Cocoa和Cocoa Touch编程中的"响应者链",但这里的模式也被称为"责任链".响应者链不仅用于处理事件,还用于菜单验证等.
上下文菜单命令以相同的方式处理.唯一真正不同的是如何创建上下文菜单:当用户执行任何手势调出上下文菜单时(通常是控制点击或右键单击),通过询问第一响应者即可立即构建上下文菜单(再次,当前"焦点"的东西)应该显示什么菜单.NSView有一个-menuForEvent:方法,通常只返回视图menu属性的内容,因此您可以设置menu具有实例的属性NSMenu,或者您可以覆盖,-menuForEvent:以便它构建菜单.当用户选择上下文菜单命令时,它将像任何其他菜单命令一样处理,从第一个响应者开始.这意味着第一个响应者不一定需要处理它提供的上下文菜单中的所有项目 - 可能有"复制"或"粘贴"之类的项目由链上的其他对象处理.
| 归档时间: |
|
| 查看次数: |
1761 次 |
| 最近记录: |