【问题标题】:NSSegmentedControl programmatically highlight segmentNSSegmentedControl 以编程方式突出显示段
【发布时间】:2014-11-05 12:00:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: cocoa osx-yosemite nssegmentedcontrol nscontrol


    【解决方案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)。

    【讨论】:

    • 谢谢米哈尔。我会试试你的代码,如果它解决了我的问题,请告诉你。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2011-01-26
    相关资源
    最近更新 更多