NSTimer не передает аргументы селектору - PullRequest
4 голосов
/ 02 декабря 2011

Я создаю NSTimer:

    [NSTimer scheduledTimerWithTimeInterval:2.0
                                     target:self
                                   selector:@selector(createObject:)
                                   userInfo:nil
                                    repeats:YES];

и createObject: определяется следующим образом:

- (void)createObject:(ccTime) dt{

    int r = arc4random() % 4;


    for (int i=0; i < r; i++) {

    character[charIndex] = [CCSprite spriteWithFile:@"o.png"];

    }
}

Чего я хочу добиться - это отправить некоторые переменные в метод. Я переписал функцию как:

* * 1010

но я не могу передать переменную cID функции из таймера. Возможно ли это сделать?

Ответы [ 5 ]

17 голосов
/ 02 декабря 2011

в соответствии с документацией методы, которые вызываются из NSTimer, нуждаются в такой подписи:

- (void)timerFireMethod:(NSTimer*)theTimer

Невозможно предоставить пользовательские параметры или более одного параметра.


Перепишите метод таймера, чтобы он использовал userInfo NSTimer

- (void)createObject:(NSTimer *)timer {
    NSDictionary *userInfo = [timer userInfo];
    int cID = [[userInfo objectForKey:@"cID"] intValue];
    /* ... */
}

, создайте userInfo, а затем запустите таймер следующим образом:

NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithInt:cID], @"cID",
                          /* ... */
                          nil];
[NSTimer scheduledTimerWithTimeInterval:2.0
                                 target:self
                               selector:@selector(createObject:)
                               userInfo:userInfo
                                repeats:YES];
7 голосов
/ 02 декабря 2011

Ваш селектор должен иметь эту подпись :

- (void)timerFireMethod:(NSTimer*)theTimer

Но есть концепция UserInfo в Какао

userInfo:
Пользовательинформация для таймера.Указанный вами объект сохраняется таймером и освобождается, когда таймер становится недействительным.Этот параметр может быть nil.

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

information = [theTimer userInfo];
1 голос
/ 24 января 2013

Вы можете передать свои параметры с помощью userInfo: [NSDictionary dictionaryWithObjectsAndKeys: parameterObj1, @ "keyOfParameter1" ...

Простой пример:

[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(handleTimer:) userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:9], @"parameter1", nil] repeats:YES];


-(void) handleTimer:(NSTimer *)timer{


    int parameter1 = [[[timer userInfo] objectForKey:@"parameter1"] integerValue];

    if(parameter1>0){

        [timer invalidate];
        timer=nil;
   }
}
1 голос
/ 02 декабря 2011

Альтернативным методом использования +scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: является использование + scheduleTimerWithTimeInterval: invocation: repeats: . NSInvocation может переносить сигнатуру и параметры любого метода. Однако установить его сложнее, чем просто установить userInfo в словарь, содержащий нужные вам вещи.

0 голосов
/ 02 декабря 2011

Параметр userInfo должен быть объектом. Другие типы данных (такие как данные C) должны быть заключены в объект, словарь или массив объектов.

...