6

私はこのコードを持っています:

-(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 に送信されました

しかし、userInfo で NSNumber クラスを使用している場合、なぜタイマーを受け取るのでしょうか?

ありがとう。

4

3 に答える 3

25

タイマー アクション メソッドは次のようになります。

-(void)rotateSelectedItem:(NSTimer*)sender

次のようにして userInfo を取得できます

NSNumber *userInfo = sender.userInfo;
于 2012-03-01T19:49:08.467 に答える
2

タイマーに登録するセレクターの署名を誤解しています。送信者はNSTimer*、コンストラクターに渡す userInfo オブジェクトではありません。

-(void)rotateSelectedItem:(NSTimer*)sender
{
    float currAngle = [selectedItem currentRotation];
    if ([sender.userInfo intValue] == RDUtilitiesBarRotationLeft)
    {
        [selectedItem rotateImage:currAngle - 1];
    }
    else
    {
        [selectedItem rotateImage:currAngle + 1];
    }
}
于 2012-03-01T19:49:00.743 に答える
2

ドキュメントから:

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

- (void)timerFireMethod:(NSTimer*)theTimer
于 2012-03-01T19:49:58.313 に答える