2014-07-23 60 views
1

我有以下方法将参数传递给选择器,它是一个参数

-(void)changeLevelWithTimeInterval:(NSTimeInterval)timeInterval withLevel:(NSUInteger)level{ 

    [NSTimer scheduledTimerWithTimeInterval:timeInterval 
           target:self 
           selector:@selector(changeLevel:) 
           userInfo:nil 
           repeats:NO]; 
} 

和我想呼叫的changeLevel:(NSUInteger)水平的方法与上述方法的电平的参数。

我试图把

[self performSelector:@selector(changeLevel:) withObject:level] 

,并试图通过这个作为一个参数,但它不工作。

回答

2

performSelector:withObject:需要一个指针对象(又名一个id)作为参数,所以没有办法在NSUInteger作为参数来传递,因为NSUInteger只是一个typedeffed unsigned int。一种特殊的解决方法是将该级别封装在NSNumber对象中,并在changeLevel:方法中获取NSNumberintValue

它可以作为去:

NSNumber *levelNumber = [NSNumber numberWithInt:(int)level]; 
[self performSelector:@selector(changeLevel:) withObject:levelNumber]; 

和变化的changeLevel:的签署和执行如下:

-(void)changeLevel:(NSNumber*)levelNumber{ 
    int level = [levelNumber intValue]; 
    //do anything you want with the level.. 
} 

对于间隔后发射的方法,你可以尝试:

[self performSelector:@selector(changeLevel:) withObject:levelNumber afterDelay:timeInterval]; 

而不是直接调度计时器。

0

我结束了使用下面的方法,而不是上面的方法,使一切正常工作。

-(void)changeLevelWithTimeInterval:(NSTimeInterval)timeInterval withLevel:(NSUInteger)level{ 

NSNumber *levelNumber = [NSNumber numberWithInt:(int)level]; 

[self performSelector:@selector(changeLevel:) withObject:levelNumber afterDelay:timeInterval]; 
}