【问题标题】:How can I get the value of an NSSlider continuously?如何连续获取 NSSlider 的值?
【发布时间】:2011-07-01 21:12:13
【问题描述】:

似乎 Cocoa 中的 NSSlider 没有提供一个委托来接收像 UISlider 的 Value Changed 这样的事件。

如何连续获取 NSSlider 的值并将其显示在 NSTextField 中,例如?

【问题讨论】:

    标签: objective-c cocoa macos nsslider


    【解决方案1】:

    您需要研究Cocoa's Target/Action mechanism。这是您需要了解的基本 Cocoa 概念。滑块(和任何其他控件)可以被赋予一个目标(某个控制器对象)和一个动作(调用该控制器对象的方法)。

    默认情况下,当用户停止拖动时会触发该操作。 在 Interface Builder 中检查滑块的 Continuous 属性,使其在您滑动时触发动作。

    【讨论】:

    • 检查 NSSlider 的 Continuous 属性是否完全有效,谢谢!
    • @meddlesome continuous 属性是我正在寻找的。谢谢!
    • 我希望有一种方法可以为 continuous 值设置单独的操作方法,并且在他们放开滑块之后。
    • @CliftonLabrum 您可以在现有操作函数中使用NSApplication.currentEvent 来检查event.type 掩码是否存在NSEvent.EventType.leftMouseDragged 并以此区分您的操作行为。如果它是由于拖累而被调用的,那是一个“持续”的调整;如果不是,则直接单击或鼠标向上松开滑块在其最终位置。
    • @CliftonLabrum 当然是一种方法,尽管它让我对非主队列事件同步感到紧张。如果不了解更多信息,就不可能说您是否应该期待麻烦,但这是需要评估和牢记的事情。
    【解决方案2】:

    使用计时器方法的一个优点是它适用于使用键盘而不是鼠标来调整滑块的情况。如果用户在“系统偏好设置”中打开了“全键盘访问”,他们可以使用 Tab 键为滑块提供焦点。然后他们可以按住箭头键以启动自动重复,此时您的情况与使用鼠标拖动类似:目标/动作反复触发,您希望在保存到数据库之前等待片刻平静。

    您确实需要小心不要过早删除您的 NSTimer。例如,如果用户在这几秒钟内退出应用程序,您可能希望在终止进程之前将滑块值“刷新”到数据库中。

    【讨论】:

      【解决方案3】:

      基于the answer of Joshua Nozzi的程序化解决方案:

      斯威夫特

      slider.isContinuous = true
      

      Objective-C

      slider.continuous = YES;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        相关资源
        最近更新 更多