NSTimer userInfo.Как объект переходит к селектору? - PullRequest
6 голосов
/ 01 марта 2012

У меня есть этот код:

-(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 ]

25 голосов
/ 01 марта 2012

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

-(void)rotateSelectedItem:(NSTimer*)sender

Вы можете войти в userInfo, выполнив

NSNumber *userInfo = sender.userInfo;
2 голосов
/ 01 марта 2012

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

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

- (void)timerFireMethod:(NSTimer*)theTimer
2 голосов
/ 01 марта 2012

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

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