我创建了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
传递给定时器中的函数。有可能这样做吗?
答案 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数据类型)需要包装在对象,字典或对象数组中。