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 以编程方式突出显示段的主要内容,如果未能解决你的问题,请参考以下文章

使用 Interface Builder Xcode 6.1.1 的 NSSegmentedControl 布局错误

osx中用于多选一可用NSSegmentedControl

线上故障突突突?如何紧急诊断排查与恢复

滴定分析-酸碱滴定-影响突跃大小的因素

GraphQL 突变为嵌套响应返回 null

如何以编程方式使用自动布局以编程方式添加 UIview?