0

我有一个旋钮可以IBAction调节.timeIntervalNSTimer

但我找不到一种方法让计时器在调整timeInterval. 我想这是因为我不断地使计时器无效并重新实例化,对吧?

有没有办法让它顺利工作 - 以便计时器将随着旋钮运动加速/减速?

-(IBAction)autoSpeed:(UISlider *)sender
{
    timeInterval = (60/sender.value) / 4;

    if (seqState){
        [self changeTempo];
    }

    [self displayBPM:[sender value]:[sender isTouchInside]];
}

-(void) changeTempo
{
    if (repeatingTimer!= nil) {
        [repeatingTimer invalidate];
        repeatingTimer = nil;
        repeatingTimer = [NSTimer scheduledTimerWithTimeInterval: timeInterval target:self selector:@selector(changeAutoSpeedLed) userInfo:nil repeats:YES];

    }
    else
        repeatingTimer = [NSTimer scheduledTimerWithTimeInterval: timeInterval target:self selector:@selector(changeAutoSpeedLed) userInfo:nil repeats:YES];
}
4

2 回答 2

1

它运行不顺畅的原因是因为您正在使用scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:,根据Apple的文档:

创建并返回一个新的 NSTimer 对象,并以默认模式将其安排在当前运行循环中。

默认模式被 UI 交互阻止,因此如果您控制旋钮,则计时器被阻止。如果您改为使用以下代码:

[[NSRunLoop currentRunLoop] addTimer:repeatingTimer forMode:NSRunLoopCommonModes];

那么代码将不会被 UI 阻止。

于 2012-12-26T15:49:23.493 回答
1

您可以在滴答声中重新创建计时器。


.h 文件

您必须创建一个称为间隔的属性。

@property NSTimeInterval interval; 

.m 文件

首先,初始化它:

self.interval = 100;
[self timerTick];

然后您可以使用该timerTick方法重新创建计时器,如果

- (void)timerTick {
    if (self.interval) {
        [self.timer invalidate];
        self.timer = [NSTimer scheduledTimerWithTimeInterval:self.interval target:self selector:@selector(timerTick) userInfo:nil repeats:YES];
        self.interval = 0;
    }


    // Do all the other stuff in the timer
}

然后您可以随时设置self.interval,计时器将自动重新创建。

于 2012-12-26T15:18:57.557 回答