NSSegmentedControl以编程方式突出显示段

时间:2014-11-05 12:00:51

标签: cocoa osx-yosemite nssegmentedcontrol nscontrol

我有一个NSSegmentedControl,在用户点击之后,应该在将操作发送到目标之前满足一些条件。

直到现在我设法通过覆盖-mouseDown事件处理程序并仅在成功检查我的条件后调用segmentedControl的[super mouseDown]处理程序才能做到这一点。 只有一个问题。在调用[super mouseDown]之前,用户没有任何视觉线索表明已单击某个段。

所以问题是:有没有办法以编程方式设置“突出显示”状态(或多或少类似于setHighlighted的“NSButtons”?

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:1)

在不满足条件时,您不需要调用-[NSSegmentedControl mouseDown],也不需要调用-[NSSegmentedCell stopTracking:at:inView:mouseIsUp:]

这是我编写的NSSegmentedControl子类,它使用委托来有条件地启用段选择:https://gist.github.com/michal-tomlein/39171668c580ac0d497d

当您按住鼠标按钮时,您会看到该段突出显示,但是如果从委托方法返回NO,则会突出显示并且选择保持不变。

如果您在Interface Builder中使用它,请不要忘记同时设置视图类(MTSegmentedControl)和单元类(MTSegmentedCell)。