Re: Displaying live NSSlider value
Re: Displaying live NSSlider value
- Subject: Re: Displaying live NSSlider value
- From: "Michael Ash" <email@hidden>
- Date: Tue, 17 Jun 2008 14:14:20 -0700
On Tue, Jun 17, 2008 at 1:19 PM, Andy Klepack
<email@hidden> wrote:
> I have an NSSlider and while the drag is in progress I would like to display the value in a text field. When the drag completes I would like the new value to get set in the user preferences and an action executed.
>
> As far as I can tell I'll have to set the slider to send its action continually in order to find out that value has changed. If that's so then I would need a way to determine whether the drag had completed and then behave appropriately.
>
> Am I wrong, is there actually some sort of delegate method like "valueDidChange:" that could be used to differentiate the drag events from the drag-complete event? If I do have to do the determination in the action itself how would I find out that the drag completed?
There is no delegate method, but it's actually fairly easy to make
your own. However, before you do that, consider whether you really
need to. Do you really need to run the final code once? Will it work
if you just run it every time the value changes? If your code isn't
really slow then this can be the simplest way to go.
However, if your code takes a significant amount of time to run such
that it disturbs the operation of the slider, or there's some other
good reason to do this, you can write code like this:
- (IBAction)sliderMoved:(id)sender
{
// update the value here
[NSObject cancelPreviousPerformRequestsWithTarget:self
selector:@selector(sliderDoneMoving:) object:sender];
[self performSelector:@selector(sliderDoneMoving:)
withObject:sender afterDelay:0];
}
- (void)sliderDoneMoving:(id)sender
{
// do your expensive update here
}
The reason this works is because while the mouse button is held on the
slider, the runloop is running in a special event tracking mode. The
delayed perform is scheduled in the default mode, and thus won't run
while the mouse button is held down. When you release the mouse
button, the blocked delayed perform finally runs. The cancellation
above it is to make sure you only ever have one, otherwise you'd get
sliderDoneMoving: called repeatedly in a flood when the mouse button
is released. The first time the method runs there is nothing to
cancel, but that's fine because it will just do nothing.
Mike
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden