【问题标题】:Obj-C: Why is my NSTextField subclass having an effect on objects I haven't assigned to it?Obj-C:为什么我的 NSTextField 子类对我没有分配给它的对象有影响?
【发布时间】:2014-09-25 21:15:55
【问题描述】:

我有一个 NSPanel,上面有大约 4 个不同的 NSTextField。我正在考虑让通常的剪切、复制、粘贴、selectAll 对某些字段起作用。

我发现的最佳解决方案似乎在这里: http://web.archive.org/web/20100126000339/http://www.cocoarocket.com/articles/copypaste.html

AXCVHandler 成为 NSTextField 的子类。在界面生成器中的 NSPanel 上,如果我将单个 NSTextField 的类更改为 AXCVHandler,如上面的链接所示,那么对我来说预期的行为将是只有单个文本字段允许剪切、复制和粘贴。剩下的 3 个字段不会,因为它们仍然被分配了 NSTextField 类。

我所看到的与我的预期行为相反。我为 AXCVHandler 设置了一个 NSTextField,突然间,我的 NSPanel 上的每个 NSTextField 都在使用剪切、复制、粘贴?!

这是为什么?剩下的 3 个文本字段被分配了 NSTextField 类,但它们在我的子类中调用 performKeyEquivalent ?!

我错过了什么?这是对 firstResponder 工作原理的误解还是其他原因?

【问题讨论】:

    标签: objective-c macos cocoa events nstextfield


    【解决方案1】:

    来自您链接到的文章:

    关于这个解决方案的一个有趣的事情是处理程序对象不需要是动作的目标视图。如果您愿意,可以让单个 NSButton 为整个窗口执行复制和粘贴操作。 (这类似于单个菜单项可以为整个应用程序执行复制或粘贴操作的方式。)

    搜索想要处理等效键的视图并不关心哪个视图是第一响应者。它搜索整个视图层次结构。一旦找到单个AXCVHandler,该对象就会执行等效键。它执行它的方式是向响应者链发送相应的操作,该响应者链确实从第一个响应者开始。因此,一个 AXCVHandler 对象足以将适当的操作定向到您的任何文本字段,因为它们中的任何一个都可以成为第一响应者。

    【讨论】:

    • 有没有办法阻止这种行为并确保这种 performKeyEquiv 响应只发生在分配的目标视图上?
    • 您可以检查所需的文本字段或所需文本字段的字段编辑器是否是第一响应者,如果是,则仅发送操作。如果您使用 NSTextField 的子类而不是 AXCVHandler 类来实现 -performKeyEquivalent: 方法,那可能是最简单的。
    猜你喜欢
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2022-01-17
    • 2015-05-29
    • 2017-01-26
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    相关资源
    最近更新 更多