我正在编写一个iPhone应用程序,用于指定用户按住按钮的时间。当用户'触摸'时,会触发buttonPressed方法,当按钮被重新释放时,又不再被保持,NSTimer应该无效。然而,事实并非如此,我很难找到解决方案。非常困难。希望你们能帮忙!这是代码:
-(IBAction)buttonReleased:(id)sender {
[stopWatchTimer invalidate];
NSString *label0 = @"0";
[labelText setText:label0];
score--;
NSString *scoreMessage =[[NSString alloc] initWithFormat:@"YOU LOSE! Your score was: %i",score];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"GAME OVER!" message:(NSString *)scoreMessage delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
[alert release];
score = 0;
tap = 0;
}
- (void)updateTimer
{
static NSInteger counter = 0;
labelText.text = [NSString stringWithFormat:@"%d", counter++];
score++;
}
-(IBAction)buttonPressed:(id)sender {
stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/1.0 target:self selector:@selector(updateTimer)userInfo:nil repeats:YES];
tap++;
}
答案 0 :(得分:1)
究竟是什么叫buttonReleased:
?按钮可以通过多种方式停止按下。例如,修饰可能位于按钮的内部或外部。
我强烈怀疑buttonPressed:
比buttonReleased:
更频繁地被召唤。因为你是直接访问你的ivars而不是使用访问器,所以你没有正确处理这个问题,并且当你分配一个新的计时器时,你可能会离开旧的计时器。
首先,始终使用访问者。不要直接混淆ivars(例外情况在init
,dealloc
和访问者本身)。像这样的许多问题都来自直接搞乱ivars。 (另外,它使代码混乱。score
是本地的,全局的还是ivar?)
其次,NSTimer
setter应如下所示:
- (void)setTimer:(NSTimer *)aTimer {
if (aTimer != timer_) {
[timer_ invalidate];
[timer_ release];
timer_ = [aTimer retain];
}
}
这可确保在更换计时器时使旧计时器无效。 if()
检查对于您调用等效self.timer = self.timer
的可能性非常重要。如果你在没有if()
检查的情况下做到这一点,那么当你不打算这样做时,你会使计时器失效。