Objective c 自定义控件中的多个嵌入式NSButtonCells

Objective c 自定义控件中的多个嵌入式NSButtonCells,objective-c,cocoa,Objective C,Cocoa,我正在尝试创建一个使用嵌入式样式NSButtonCell对象的自定义范围栏。但是,当鼠标悬停时,我无法绘制挡板。我可以通过创建跟踪区域并在鼠标在里面的时候将showsBorderOnlyWhileMouseInside设置为NO(否),在鼠标移动到外面的时候设置为YES(是),来实现这一点,但这对我来说就像是一个黑客,特别是因为NSButtonCell将自己进行跟踪 如果我使用控件的setCell方法,按钮单元格将调用控件的addTrackingRect:owner:userData:assum

我正在尝试创建一个使用嵌入式样式NSButtonCell对象的自定义范围栏。但是,当鼠标悬停时,我无法绘制挡板。我可以通过创建跟踪区域并在鼠标在里面的时候将showsBorderOnlyWhileMouseInside设置为NO(否),在鼠标移动到外面的时候设置为YES(是),来实现这一点,但这对我来说就像是一个黑客,特别是因为NSButtonCell将自己进行跟踪

如果我使用控件的setCell方法,按钮单元格将调用控件的addTrackingRect:owner:userData:assumeInside:并设置自己的跟踪,以便在鼠标悬停时绘制挡板。但是,如果我想在同一个控件中使用多个按钮单元格,我尝试使用按钮单元格的setControlView方法将每个单元格的controlView设置为自定义控件,但它不会像setCell那样提示单元格设置跟踪区域


该技术必须是可行的,因为NSMatrix做到了这一点,但在阅读了所有可用的API和论坛之后,我还没有找到一种方法来启动NSButtonCell的跟踪行为,而不使用其控件的setCell方法。我的额头是血腥的,从桌子上打过去。帮助会被赞赏。

首先,创可贴可能是第一个有帮助的东西。p> 您是否尝试过使用NSButtonCell的-updateTrackingAreaWithFrame:inView:方法?它没有文档记录,但显示在Leopard上类转储生成的NSButtonCell头中。我不确定官方说法或普遍共识是关于使用不以下划线开头的非文档方法的,所以请注意emptor


另一个注意事项:您可能希望在视图中使用多个按钮来完成此任务,而不是使用多个buttonCells。在现有类(如NSMatrix)的基础上建模您自己的类是令人钦佩的,但对于复杂的行为,如您正在寻找的,稍微偏离一点通常会更有成效。使用多个视图而不是使用一个包含一堆单元格的单一视图的概念仍然有一些优点,但如果走这条路需要一个黑客实现,我会走另一条路。

我后来回到这个问题,发现如果您将自定义子类更改为NSControl而不是NSView,那么addTrackingRect方法将由单元格自动处理。只要根据需要调用单元格的mouseEntered/mouseExited方法,即可实现单元格的悬停模式。希望这对某人有所帮助。

谢谢,德克-我完全同意。我认为文档对NSCell的赞扬让我为使用按钮感到内疚。我原以为我会在老鼠洞里追上一段时间,但似乎没有一个令人满意的解决方案来实现这一点。我尝试了updateTrackingAreaWithFrame:inView:方法,但没有成功。当Cocoa使用NSButton执行此操作时,查看堆栈会显示大量私有API正在被传递,因此看起来我们并不打算自己执行此操作。