递增一次后NSTimer停止

时间:2014-03-11 08:24:50

标签: ios uilabel nstimer object-state

我有一个NSTimer,我想每秒更新一个标签。我的代码是:

- (IBAction)OnClickEmergencyButton:(id)sender
{
    emergencyAlertTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(emergencyTimer) userInfo:nil repeats:YES];
    [emergencyAlertTimer fire];
}

- (void)emergencyTimer
{
    int i = 0;
    _emergencyAlertTriggerTimerLabel.text = [NSString stringWithFormat:@"%d", ++i];
}

当我运行它时,标签最初显示为“1”然后停止。

我希望标签每秒都能连续计数,例如“1”,“2”,“3”......

5 个答案:

答案 0 :(得分:5)

您的计时器没有问题。问题在于emergencyTimer中的变量声明,您将其声明为局部变量。因此,每次计时器触发时,变量将再次初始化为0。因此,将变量声明为static,以便它可以保留该值。

更改方法如:

-(void)emergencyTimer
{
    static int timeValue = 0;
    _emergencyAlertTriggerTimerLabel.text = [NSString stringWithFormat:@"%d",++timeValue];
}

为什么静态变量和为什么不是实例变量?

我没有使用实例变量来保持变量“Scope”的安全。如果我把它作为一个实例变量,它可以被同一个类的其他方法访问,如果不需要那个功能,我认为使用静态变量会更好。

答案 1 :(得分:3)

问题在于此代码

int i=0;

每次调用timer方法时,整数i都会被初始化,标签将始终显示为“1”。

设置此变量globalstatic以解决您的问题。

答案 2 :(得分:2)

从计时器操作方法中删除int i=0;,因为它的值始终为零。您应该使用实例变量(@property)来存储timerCounter并将其递增并使用它来填充标签。

在某个时间点,您需要使计时器无效。在创建新计时器并替换旧计时器的引用之前,这一点尤为重要。目前,如果你按两次按钮,你将有2个计时器在运行,你的标签将每秒增加两次......

@property (nonatomic, assign) NSInteger timerCounter;

- (IBAction)OnClickEmergencyButton:(id)sender {
    [emergencyAlertTimer invalidate];
    emergencyAlertTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(emergencyTimer) userInfo:nil repeats:YES];
    [emergencyAlertTimer fire];
}

- (void)emergencyTimer {
    _emergencyAlertTriggerTimerLabel.text = [NSString stringWithFormat:@"%d", self.timerCounter];
    self.timerCounter++;
}

当从显示/取消分配中删除视图时,您也应该使计时器无效。

答案 3 :(得分:1)

始终计时器被调用emergencyTimer,但您的i值不会更改,因为它是一个局部变量,i的范围将保留在函数调用结束时。尝试使用静态变量保持全局......

-(void)emergencyTimer{
    static int i=0; // initialize at first time only..
    _emergencyAlertTriggerTimerLabel.text = [NSString stringWithFormat:@"%d",++i];
   if ( i == 100) 
       [ emergencyAlertTimer invalidate] // stop at certain condition
}

答案 4 :(得分:0)

首先,每个人都是对的,无论你当前做什么,你只会显示0,所以使用实例变量。

关于唯一一次射击,而不是[NSTimer fire]试试这个:

emergencyAlertTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(emergencyTimer) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:emergencyAlertTimer forMode:NSRunLoopCommonModes];