1

好的,我想创建多个计时器,它们都在不同的时间(25、50,1 分钟、1 分钟 30 秒……)开始,但我不知道如何让它在它达到 0 时停止,当它达到零时,带上“播放器”换一种说法。

这是我的 .h 文件

@interface ViewController :UIViewController {

IBOutlet UILabel *seconds;

NSTimer *timer;

int MainInt;
}

@end

这是我的 .m 文件

@implementation ViewController

-(void)countDownDuration {

MainInt -= 1;

seconds.text = [NSString stringWithFormat:@"%i", MainInt];

}

-(IBAction)start:(id)sender {

MainInt = 25;

timer = [NSTimer scheduledTimerWithTimeInterval:1.0

                                         target:self
                                       selector:@selector(countDownDuration)
                                       userInfo:nil
                                        repeats:YES];
}

@end
4

1 回答 1

5

NSTimer 不会自动执行此操作,但将其添加到您的 countDownDuration 方法很简单。例如:

-(void)countDownDuration {
  MainInt -= 1;
  seconds.text = [NSString stringWithFormat:@"%i", MainInt];
  if (MainInt <= 0) {
    [timer invalidate];
    [self bringThePlayerToAnotherView];
  }
}

当然,您要创建多个计时器。您可以将每个变量存储在不同的变量中,并为每个变量分配一个不同的选择器。但是如果你查看 NSTimer 的文档,回调方法实际上将定时器对象作为选择器;你忽略了它,但你不应该。

同时,您可以将所需的任何类型的对象存储为计时器的 userInfo,因此这是为每个计时器存储单独的当前倒计时值的好地方。

因此,您可以执行以下操作:

-(void)countDownDuration:(NSTimer *)timer {
  int countdown = [[timer userInfo] reduceCountdown];
  seconds.text = [NSString stringWithFormat:@"%i", countdown];
  if (countdown <= 0) {
    [timer invalidate];
    [self bringThePlayerToAnotherView];
  }
}

-(IBAction)start:(id)sender {
  id userInfo = [[MyCountdownClass alloc] initWithCountdown:25];
  timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                           target:self
                                         selector:@selector(countDownDuration:)
                                         userInfo:userInfo
                                          repeats:YES];
}

我留下了一些未写明的细节(比如 - 的定义MyCountdownClass必须包含方法initWithCountdown:并且reduceCountdown做正确的事情),但它们都应该非常简单。(此外,您可能想要一个 userInfo 存储的不仅仅是倒计时值——例如,如果每个计时器将玩家发送到不同的视图,您也必须将视图存储在那里。)

PS,注意你现在需要@selector(countDownDuration:). ObjC 的新手总是把这件事搞砸。countDownDuration:并且countDownDuration是完全不相关的选择器。

PPS, 的完整定义MyCountdownClass必须可见countDownDuration:(除非您有其他具有相同选择器的类)。您可能希望显式转换 to 的结果userInfoMyCountdownClass *使事情更清楚。

于 2012-09-20T00:42:58.607 回答