【发布时间】:2011-07-01 21:12:13
【问题描述】:
似乎 Cocoa 中的 NSSlider 没有提供一个委托来接收像 UISlider 的 Value Changed 这样的事件。
如何连续获取 NSSlider 的值并将其显示在 NSTextField 中,例如?
【问题讨论】:
标签: objective-c cocoa macos nsslider
似乎 Cocoa 中的 NSSlider 没有提供一个委托来接收像 UISlider 的 Value Changed 这样的事件。
如何连续获取 NSSlider 的值并将其显示在 NSTextField 中,例如?
【问题讨论】:
标签: objective-c cocoa macos nsslider
您需要研究Cocoa's Target/Action mechanism。这是您需要了解的基本 Cocoa 概念。滑块(和任何其他控件)可以被赋予一个目标(某个控制器对象)和一个动作(调用该控制器对象的方法)。
默认情况下,当用户停止拖动时会触发该操作。 在 Interface Builder 中检查滑块的 Continuous 属性,使其在您滑动时触发动作。
【讨论】:
continuous 属性是我正在寻找的。谢谢!
continuous 值设置单独的操作方法,并且在他们放开滑块之后。
NSApplication.currentEvent 来检查event.type 掩码是否存在NSEvent.EventType.leftMouseDragged 并以此区分您的操作行为。如果它是由于拖累而被调用的,那是一个“持续”的调整;如果不是,则直接单击或鼠标向上松开滑块在其最终位置。
使用计时器方法的一个优点是它适用于使用键盘而不是鼠标来调整滑块的情况。如果用户在“系统偏好设置”中打开了“全键盘访问”,他们可以使用 Tab 键为滑块提供焦点。然后他们可以按住箭头键以启动自动重复,此时您的情况与使用鼠标拖动类似:目标/动作反复触发,您希望在保存到数据库之前等待片刻平静。
您确实需要小心不要过早删除您的 NSTimer。例如,如果用户在这几秒钟内退出应用程序,您可能希望在终止进程之前将滑块值“刷新”到数据库中。
【讨论】:
基于the answer of Joshua Nozzi的程序化解决方案:
斯威夫特
slider.isContinuous = true
Objective-C
slider.continuous = YES;
【讨论】: