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

Но если я прерываю в userInfo класс NSNumber, почему я получаю таймер?

Благодарю.

3 ответа

Решение

Ваш метод действия таймера должен выглядеть следующим образом

-(void)rotateSelectedItem:(NSTimer*)sender

Вы можете получить в userInfo, выполнив

NSNumber *userInfo = sender.userInfo;

Вы неправильно поняли подпись селектора, который вы регистрируете с помощью таймера. Отправитель NSTimer*, а не объект userInfo, который вы передаете в его конструктор:

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

Из документации:

Сообщение для отправки на цель при срабатывании таймера. Селектор должен иметь следующую подпись:

- (void)timerFireMethod:(NSTimer*)theTimer
Другие вопросы по тегам