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 回答