Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何在没有子类化的情况下绘制Cocoa聚焦环?_Macos_Cocoa_Focus_Xojo - Fatal编程技术网

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

Macos 如何在没有子类化的情况下绘制Cocoa聚焦环?,macos,cocoa,focus,xojo,Macos,Cocoa,Focus,Xojo,我想在控件周围画一个合适的、现代的动画对焦环,根据,这应该是一个覆盖-drawFocusRingMask和-focusRingMaskBounds方法的简单问题 问题是,对于我必须使用的这个项目,它可以声明和调用Cocoa方法,但并没有给我任何机会来实际创建自己的视图子类 那么,有没有办法在不生成实际子类的情况下获得一个合适的聚焦环?其他一些方法,也许是在10.7技术说明之后介绍的,可以完成这项工作吗?或者某种在运行时偷偷地将方法注入现有类的方法?正如一条评论所建议的,如果您想添加可选协议方法,

我想在控件周围画一个合适的、现代的动画对焦环,根据,这应该是一个覆盖-drawFocusRingMask和-focusRingMaskBounds方法的简单问题

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


那么,有没有办法在不生成实际子类的情况下获得一个合适的聚焦环?其他一些方法,也许是在10.7技术说明之后介绍的,可以完成这项工作吗?或者某种在运行时偷偷地将方法注入现有类的方法?

正如一条评论所建议的,如果您想添加可选协议方法,
class\u addMethod()
是正确的。公共macoslib项目有一些代码显示了如何做到这一点,只需搜索该名称

但是,如果该函数已实现,则无法添加其他函数。在这种情况下,方法swizzling就是解决方案。用另一个函数地址替换选择器的函数地址,然后调用原来的函数地址,这是一种常见的方法

不过,在Xojo中,我手头似乎没有这样的例子

更新


对于标准Cocoa控件,最简单的解决方案是相应地设置
NSView
属性
focusRingType
(可在macoslib中获得)。只有自定义控件才需要实现
drawFocusRingMask

Xojo可以使用libobjc函数吗(← 可点击)?这是您添加的自定义Cocoa控件吗?我相信,如果您通过MBS插件来实现这一点,那么您也可以切换NSControl的focusRing属性,而无需执行您计划的操作。我已经在自己的应用程序中做过几次了。这是为了在TextArea控件周围获得一个聚焦环。希望避免对MBS插件的需求。这听起来很有希望,但到目前为止我还不能让它工作。我能够在TextArea类(顺便称为XOJScrollView)上调用class_addMethod,并添加drawFocusRingMask和focusRingMaskBounds,实现如Q&A所示,但我仍然没有获得焦点环。我还尝试深入视图层次结构(XOJScrollView包含一个NSClipView,其中包含一个XOJTextView;XOJScrollView还包含一个NSScroller),并将这些方法添加到XOJTextView。添加再次成功,但仍然没有出现聚焦环。确认,在本例中,设置focusRingType是足够的。我错误地认为它在本例中不起作用。