如何在没有子类化的情况下绘制 Cocoa 对焦环?

How to draw a Cocoa focus ring without subclassing?

我想在控件周围绘制一个合适的、现代的动画聚焦环,根据 Q&A 1785,这应该是重写 -drawFocusRingMask 和 -focusRingMaskBounds 方法的简单问题。

麻烦的是,对于这个项目,我必须使用 Xojo,它可以声明和调用 Cocoa 方法,但没有给我任何机会来实际创建我自己的视图 subclass.

那么,有什么方法可以在不制作真正的子class的情况下获得合适的对焦环吗?其他一些方法(可能在本 10.7 技术说明之后引入)可以完成工作?或者一些在运行时将方法注入现有 class 的偷偷摸摸的方法?

正如一条评论所建议的,如果您想添加一个可选的协议方法,class_addMethod() 是正确的。 public macoslib 项目有一些代码展示了如何做到这一点,只需搜索该名称即可。

但是,如果该功能已经实现,则无法再添加。在这种情况下,方法调配是解决方案。常用的方法是将一个选择器的函数地址替换为另一个,然后调用原来的。

不过,我手头似乎没有 Xojo 中的示例。

更新

对于标准 Cocoa 控件,最简单的解决方案是相应地设置 NSView 属性 focusRingType(在 macoslib 中可用) ).实施 drawFocusRingMask 仅对自定义控件是必要的。