确定NSSlider旋钮何时在连续模式下"松开"

dbr*_*dbr 15 cocoa objective-c nsslider

我正在使用NSSlider控件,并且我已将其配置为使用连续模式,以便在用户滑动时可以使用滑块的当前值不断更新NSTextField.我遇到的问题是,在用户放开旋钮之前我不想"提交"该值,即我不希望我的应用程序考虑该值,除非用户放开滑块来表示它达到了理想的价值.目前,我无法知道何时是这样的; 动作方法只是连续调用,没有指示滑块何时被释放.

如果可能的话,我需要一个解决方案来覆盖边缘情况,例如用户使用键盘或辅助功能工具(如果有这样的东西)与滑块交互.我开始研究使用鼠标事件,但由于我刚刚概述的原因,它似乎不是最佳解决方案.

mar*_*rux 28

这对我有用(并且比子类NSSlider更容易):

- (IBAction)sizeSliderValueChanged:(id)sender {
    NSEvent *event = [[NSApplication sharedApplication] currentEvent];
    BOOL startingDrag = event.type == NSLeftMouseDown;
    BOOL endingDrag = event.type == NSLeftMouseUp;
    BOOL dragging = event.type == NSLeftMouseDragged;

    NSAssert(startingDrag || endingDrag || dragging, @"unexpected event type caused slider change: %@", event);

    if (startingDrag) {
        NSLog(@"slider value started changing");
        // do whatever needs to be done when the slider starts changing
    }

    // do whatever needs to be done for "uncommitted" changes
    NSLog(@"slider value: %f", [sender doubleValue]);

    if (endingDrag) {
        NSLog(@"slider value stopped changing");
        // do whatever needs to be done when the slider stops changing
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在某些MacBook Pro上,通过触控板点击滑块上的位置(实际上没有拖动)将永远不会给你鼠标 - 意味着你永远不会提交该值的变化. (3认同)
  • 顺便说一句,你必须首先检查NSSlider接口的"连续"值才能使用, (2认同)

fjo*_*him 7

您还可以在action方法中检查当前事件的类型:

- (IBAction)sliderChanged:(id)sender
{
    NSEvent *currentEvent = [[sender window] currentEvent];
    if ([currentEvent type] == NSLeftMouseUp) {
        // the slider was let go
    }
}
Run Code Online (Sandbox Code Playgroud)