NSTIMER USERINFO。オブジェクトがセレクタにどのように渡されているのでしょうか。

StackOverflow https://stackoverflow.com/questions/9522872

  •  15-11-2019
  •  | 
  •  

質問

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

-(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をuserInfo a nsnumberクラスで一時停止しているなら、なぜタイマーを受けていますか?

ありがとう。

役に立ちましたか?

解決

Your timer action method should look like this

-(void)rotateSelectedItem:(NSTimer*)sender

You can get at the userInfo by doing

NSNumber *userInfo = sender.userInfo;

他のヒント

You misunderstood the signature of the selector that you register with the timer. The sender is NSTimer*, not the userInfo object that you pass into its constructor:

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

From the documentation:

The message to send to target when the timer fires. The selector must have the following signature:

- (void)timerFireMethod:(NSTimer*)theTimer
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top