Как создать таймер обратного отсчета в xcode 4.5

Хорошо, я хочу создать НЕСКОЛЬКО таймеров, которые все запускаются в разное время (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

1 ответ

Решение

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: (если у вас нет другого класса с такими же селекторами). Вы можете явно привести результат userInfo в MyCountdownClass * чтобы прояснить ситуацию.

Другие вопросы по тегам