NSSegmentedControl 以编程方式突出显示段
Posted
技术标签:
【中文标题】NSSegmentedControl 以编程方式突出显示段【英文标题】:NSSegmentedControl programmatically highlight segment 【发布时间】:2014-11-05 12:00:51 【问题描述】:我有一个NSSegmentedControl
,其中,在用户点击后,在将操作发送到其目标之前应该满足一些条件。
到现在为止,我通过覆盖-mouseDown
事件处理程序并仅在成功检查我的条件后调用segmentedControl 的[super mouseDown]
处理程序来做到这一点。
只有一个问题。在调用[super mouseDown]
之前,用户没有任何视觉线索表明某个片段已被单击。
所以问题是:有没有办法以编程方式设置“突出显示”状态(或多或少类似于 NSButtons
的“setHighlighted
”)?
【问题讨论】:
【参考方案1】:您可以在操作方法中取消选择单击的段。 您可以通过其他操作方法绕道
- (IBAction)toggleSegments:(id)sender
NSSegmentedControl *segmentedControl = sender;
NSInteger selectedSegment = segmentedControl.selectedSegment;
if (! conditionsAreMet)
[segmentedControl setSelected:NO forSegment:selectedSegment];
return;
[NSApp sendAction:@selector(reallyToggleSegments:) to:nil from:sender];
【讨论】:
谢谢皮埃尔。您的解决方案总比没有好,但仍有一些意义。例如,在测试期间,该段将显示为selected,表明该选择已被接受。我正在寻找一种方法来仅突出显示该片段,而不是选择它。【参考方案2】:当不满足条件时,不要调用-[NSSegmentedControl mouseDown]
,而不是调用-[NSSegmentedCell stopTracking:at:inView:mouseIsUp:]
。
这是我编写的 NSSegmentedControl 子类,它使用委托有条件地启用段选择:https://gist.github.com/michal-tomlein/39171668c580ac0d497d
当您按住鼠标按钮时,您会看到该段被突出显示,但如果您从委托方法返回 NO
,则不会突出显示并且选择保持不变。
如果您在 Interface Builder 中使用它,请不要忘记同时设置视图类 (MTSegmentedControl
) 和单元类 (MTSegmentedCell
)。
【讨论】:
谢谢米哈尔。我会试试你的代码,如果它解决了我的问题,请告诉你。以上是关于NSSegmentedControl 以编程方式突出显示段的主要内容,如果未能解决你的问题,请参考以下文章