iPodとかQuickTimePlayerのような、再生する位置を表示・変更できるようなスライダーを使いたいと思って、NSSliderにジャカジャカ位置を送っていたら、うまいことクリックして変更できなくて、あれこれ調べたらNSSliderからNSSliderCellを取得してmouseDownFlagsってのをチェックすれば良い事が分かりました。
そこらへんを検証してみたコードが以下のような感じです。タイマーはNSEventTrackingRunLoopModeでスライダーを変更中も関係なく動かしていますが、マウスで操作中のときは値を送らないようにしています。
#import <Cocoa/Cocoa.h> @interface Controller : NSObject { IBOutlet NSSlider *slider; float sliderValue; } - (IBAction)setValue:(id)sender; @end @implementation Controller - (void)awakeFromNib { [slider setMinValue:0]; [slider setMaxValue:100]; [slider setContinuous:NO]; NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(sendSliderValue) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode]; } - (void)sendSliderValue { NSSliderCell *cell = [slider cell]; if (![cell mouseDownFlags]) { sliderValue++; if (sliderValue > 100) { sliderValue = 0; } [slider setFloatValue:sliderValue]; } } - (IBAction)setValue:(id)sender { sliderValue = [sender floatValue]; } @end