1

我有一个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”……

4

5 回答 5

5

你的计时器没有问题。问题在于 中的变量声明emergencyTimer,您将其声明为局部变量。因此,每次定时器触发时,变量都会再次初始化为 0。所以将变量声明为静态的,这样它就可以保留值。

改变方法,如:

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

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

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

于 2014-03-11T08:27:41.713 回答
3

问题在于此代码

int i=0;

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

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

于 2014-03-11T08:31:17.513 回答
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++;
}

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

于 2014-03-11T08:39:05.207 回答
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
}
于 2014-03-11T08:29:27.017 回答
0

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

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

emergencyAlertTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(emergencyTimer) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:emergencyAlertTimer forMode:NSRunLoopCommonModes];
于 2014-03-11T10:28:24.970 回答