【问题标题】:How to stop NSTimer at a specific point?如何在特定点停止 NSTimer?
【发布时间】:2013-10-26 14:49:04
【问题描述】:

我创建了一个简单的按钮游戏,每次点击按钮都会给用户一个分数。该按钮每 1.5 秒随机出现在屏幕上。我希望游戏在 30 秒或 20 个随机按钮弹出后结束。我一直在使用下面的代码在屏幕上随机弹出按钮:

timer = [NSTimer scheduledTimerWithTimeInterval: 1.5 target:self
         selector:@selector(moveButton:) 
         userInfo:nil 
         repeats:YES];

我已经在头文件中声明了定时器:

NSTimer *timer;
@property (nonatomic, retain) NSTimer *timer;

我在Using Timers 上阅读了 Apple Docs,但未能完全理解。我想也许我可以使用:

- (void)countedTimerFireMethod:(NSTimer *)timer{
  count ++;
  if(count > 20){
     [self.timer invalidate];
     self.timer = nil;

但它不能正常工作。我究竟做错了什么?我是 Objective-C 的新手,所以我对事情的工作原理不是很熟悉。

【问题讨论】:

  • 计数在哪里声明?您是否在计数上设置了断点以查看每次调用是什么?
  • 你能定义“不能正常工作”吗?你看到了什么你不想要的行为?

标签: ios objective-c nstimer


【解决方案1】:

问题出在您的计时器方法上,您正在传递 moveButton 方法,但在下面的方法中,您正在停止计时器的方法名称不同,因此请尝试以下操作:-

  self.timer = [NSTimer     
  scheduledTimerWithTimeInterval: 1.5 target:self
     selector:@selector(moveButton:) 
     userInfo:nil 
     repeats:YES];

//只改下面的方法名

 - (void)moveButton:(NSTimer *)timer{
  count ++;
  if(count > 20){
    [self.timer invalidate];
    self.timer = nil;}

【讨论】:

  • 要明确,问题是传递给 schedule 方法的选择器与下面的方法名称不同。
  • 非常感谢!!!虽然这并没有直接回答我的问题,但它确实让我找到了答案。
【解决方案2】:

如果您使用的是新版本的 Xcode,则无需声明

NSTimer *timer;

在安排计时器时,您可以使用

self.timer = [NSTimer scheduledTimerWithTimeInterval: 1.5 target:self
         selector:@selector(moveButton:) 
         userInfo:nil 
         repeats:YES]

而不是

timer = [NSTimer scheduledTimerWithTimeInterval: 1.5 target:self
         selector:@selector(moveButton:) 
         userInfo:nil 
         repeats:YES]

您正在使用正确的方法来停止计时器,即invalidate

您也可以参考link 以获得更多说明。

如果你通过上面的代码解决了这个问题,请告诉我。

【讨论】:

    猜你喜欢
    • 2015-12-08
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 2012-08-16
    • 2012-11-06
    相关资源
    最近更新 更多