NStimer — что я делаю неправильно здесь?

Я использовал NSTimer успешно, но теперь испытываю затруднения из-за него. Несомнительно что-то глупое. Цените другую пару глаз. Выполняя отладчик, я вижу, что applicationDidFinishLaunching называют, но триггер никогда не называют.

-(void) trigger:(NSTimer *) theTimer{
    NSLog(@"timer fired");
}

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger) userInfo:nil repeats:YES];

    [window makeKeyAndVisible];
}
6
задан morgancodes 7 February 2010 в 21:53
поделиться

3 ответа

Селектор должен иметь следующую сигнатуру:

- (void)timerFireMethod:(NSTimer*)theTimer

, поэтому вам понадобится

@selector(trigger:)

- edit -

Возможно, вы делаете это где-то еще, но в коде, который вы включили, вы фактически не запускаете таймер. Вы должны добавить его в NSRunLoop, прежде чем он вообще сможет инициировать какие-либо события.

 [[NSRunLoop currentRunLoop] addTimer:nst forMode:NSDefaultRunLoopMode];

Если я правильно прочитал примеры. Я использовал только тот метод инициализации, который автоматически добавляет его к текущему NSRunLoop. Вам действительно стоит посмотреть документацию разработчика, которую кто-то добавил в комментарии к моему сообщению.

13
ответ дан 8 December 2019 в 14:43
поделиться

Две вещи:

1) как говорят другие, метод должен иметь следующую подпись. .

-(void) trigger:(NSTimer *) theTimer;

и вы делаете таймер таким образом:

nst = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(trigger:) userInfo:nil repeats:YES];

2) простое создание таймера не запускает его. Как в документации сказано :

Вы должны добавить новый таймер в цикл выполнения , используя addTimer: forMode :. Затем по истечении секунд таймер срабатывает, вызывая вызов. (Если таймер настроен на повторение, нет необходимости впоследствии повторно добавлять таймер в цикл выполнения.)

Вот пример реального функционирования код, который можно смоделировать после. Создание таймера такое же, как и у вас, но оно также правильно добавляет его в цикл выполнения.

[[NSRunLoop currentRunLoop] addTimer:
     [NSTimer timerWithTimeInterval:0.1
                             target:self
                           selector:@selector(someSelector:)
                           userInfo:nil
                            repeats:NO]
                                 forMode:NSDefaultRunLoopMode];
2
ответ дан 8 December 2019 в 14:43
поделиться

Селектор, который вы даете таймеру, trigger , указывает, что он должен вызывать метод, не принимающий параметров. Либо измените запускаемый таймером метод на

 - (void)trigger
 {
      // look at me, I don't take any parameters
      NSLog(@"timer fired");
 }

, либо измените свой первоначальный вызов таймера, чтобы использовать @selector (trigger:) .

1
ответ дан 8 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: