我有一个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”......
答案 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”。
设置此变量global
或static
以解决您的问题。
答案 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];