NSResponder 是 macOS AppKit 框架中的一个核心类,几乎所有 UI 控件(如 NSView、NSWindow、NSApplication)都继承自 NSResponder。
主要功能
1、事件响应链(Responder Chain)
它让 app 可以接收和处理各种事件:鼠标、键盘、菜单命令等。
所有响应者对象构成一条“响应链”,当一个控件无法处理事件时,会将事件传递给下一个响应者。
2、处理输入事件
NSResponder 定义了很多事件处理方法,比如:
override func mouseDown(with event: NSEvent)
override func keyDown(with event: NSEvent)
override func flagsChanged(with event: NSEvent)
override func performKeyEquivalent(with event: NSEvent) -> Bool
3、菜单和快捷键命令
NSResponder 还用于响应菜单项和快捷键命令:
override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool
override func undo(_ sender: Any?)
override func copy(_ sender: Any?)
响应链
事件响应顺序通常如下:
NSView → NSWindow → NSWindowController → NSDocument → NSApplication
举个例子:当在一个 TextField 中按下 Command + C:
1、TextField 看自己是否实现了 copy(_:);
2、如果没有,它就把事件传给上一级响应者(可能是所在的 NSView);
3、一直传,直到 NSApplication,如果没人处理,则事件作废。
常见子类
1、NSApplication:应用程序主对象。
2、NSWindow:窗口。
3、NSView:所有控件的父类。
4、NSViewController:控制器,管理视图。
5、NSMenuItem:菜单项(也可响应 selector)
常见方法
1、mouseDown(with:):鼠标点击。
2、keyDown(with:):键盘按下。
3、performKeyEquivalent(_:):快捷键事件处理。
4、validateMenuItem(_:):菜单项是否可用。
5、undo(_:) / redo(_:):响应编辑操作。
使用示例
1、拦截键盘事件
class MyView: NSView {
override func keyDown(with event: NSEvent) {
print("按下键盘:\(event.charactersIgnoringModifiers ?? "")")
}
}
NSResponder 提供了这些回调点,可以在任意层级自定义事件行为。
总结
NSResponder是几乎所有UI控件的父类,可以实现鼠标点击、键盘按下和快捷键事件的处理,还可以自定义事件的行为。