NSTimer不会将参数传递给选择器

时间:2011-12-02 14:26:31

标签: ios objective-c cocoa-touch nstimer

我创建了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"];

    }
}

我想要实现的是将一些变量发送到方法中。我把这个函数重写为:

- (void)createObject:(ccTime) dt cID:(int)cID {

    int r = arc4random() % 4;


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

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

    }
}

但我无法将变量cID传递给定时器中的函数。有可能这样做吗?

5 个答案:

答案 0 :(得分:17)

根据从NSTimer调用的documentation方法需要这样的签名:

- (void)timerFireMethod:(NSTimer*)theTimer

无法提供自定义参数或多个参数。


因此,重写您的计时器方法,以便它使用NSTimer的userInfo

- (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];

答案 1 :(得分:7)

您的选择器必须包含此signature

- (void)timerFireMethod:(NSTimer*)theTimer

但是Cocoa中有UserInfo的概念

  

userInfo:
  计时器的用户信息。您指定的对象由计时器保留,并在计时器失效时释放。此参数可能为零。

所以很明显,您可以使用它将信息传递给定时器调用的方法,并且从该方法可以访问UserInfo。

information = [theTimer userInfo];

答案 2 :(得分:1)

使用+scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:的另一种方法是使用+scheduledTimerWithTimeInterval:invocation:repeats:NSInvocation可以包装任何方法签名和参数。但是,设置比设置userInfo到包含所需内容的字典更复杂。

答案 3 :(得分:1)

您可以使用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;
   }
}

答案 4 :(得分:0)

userInfo参数必须是一个对象。其他数据类型(例如C数据类型)需要包装在对象,字典或对象数组中。