macOS UI控件父类NSResponder
macOS UI控件父类NSResponder

macOS UI控件父类NSResponder

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控件的父类,可以实现鼠标点击、键盘按下和快捷键事件的处理,还可以自定义事件的行为。

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注