2014-07-23 62 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]; 
}