2012-03-01 7 views
6

私はこのコードを持っている:NSTimer userInfo。オブジェクトがセレクタにどのように渡っていますか?

-(void)startRotation:(RDUtilitiesBarRotation)mode { 
    rotationTimer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(rotateSelectedItem:) userInfo:[NSNumber numberWithInt:mode] repeats:YES]; 
} 
-(void)rotateSelectedItem:(NSNumber*)sender { 
    float currAngle = [selectedItem currentRotation]; 
    if ([sender intValue] == RDUtilitiesBarRotationLeft) { 
     [selectedItem rotateImage:currAngle - 1]; 
    } 
    else { 
     [selectedItem rotateImage:currAngle + 1]; 
    } 
} 
-(void)stopRotation { 
    [rotationTimer invalidate]; 
    rotationTimer = nil; 
} 

目標は、ユーザがボタンを保持しながら、ビューの回転を開始します。ユーザーがそれを解放すると、タイマーは停止します。

しかし、私はこれを与えている:

を - [__ NSCFTimer intValue]:認識されていないセレクタが

0x4ae360インスタンスに送信された。しかし、私は「なぜ私は、のNSNumberクラスのUserInfoにpaasingていた場合タイマーを受け取っていますか?

ありがとうございました。

答えて

25

あなたのタイマーアクションメソッドは、この

-(void)rotateSelectedItem:(NSTimer*)sender 

のようになります。あなたは

NSNumber *userInfo = sender.userInfo; 
を行うことによってのUserInfoで取得することができます:送信者は、あなたがそのコンストラクタに渡すユーザ情報オブジェクトは、 NSTimer*ではありません
2

タイマーに登録したセレクタの署名が誤解されました。

-(void)rotateSelectedItem:(NSTimer*)sender 
{ 
    float currAngle = [selectedItem currentRotation]; 
    if ([sender.userInfo intValue] == RDUtilitiesBarRotationLeft) 
    { 
     [selectedItem rotateImage:currAngle - 1]; 
    } 
    else 
    { 
     [selectedItem rotateImage:currAngle + 1]; 
    } 
} 
2

文書から:

タイマーが起動したときにターゲットに送信するメッセージ。セレクタは は、次の署名が必要です

- (void)timerFireMethod:(NSTimer*)theTimer 
関連する問題