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