Informações do usuário NSTimer.Como o objeto está passando para o seletor?
Pergunta
Eu tenho este código:
-(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;
}
O objetivo é começar a girar uma visualização enquanto o usuário segura um botão.Quando o usuário liberar o cronômetro irá parar.
Mas estou dando isso:
-[__NSCFTimer intValue]:seletor não reconhecido enviado para instância 0x4ae360
Mas se estou inserindo userInfo uma classe NSNumber, por que estou recebendo o cronômetro?
Obrigado.
Solução
Seu método de ação do temporizador deve ser parecido com este
-(void)rotateSelectedItem:(NSTimer*)sender
Você pode acessar o userInfo fazendo
NSNumber *userInfo = sender.userInfo;
Outras dicas
Você entendeu mal a assinatura do seletor que você registra no cronômetro.O remetente é NSTimer*
, não o objeto userInfo que você passa para seu construtor:
-(void)rotateSelectedItem:(NSTimer*)sender
{
float currAngle = [selectedItem currentRotation];
if ([sender.userInfo intValue] == RDUtilitiesBarRotationLeft)
{
[selectedItem rotateImage:currAngle - 1];
}
else
{
[selectedItem rotateImage:currAngle + 1];
}
}
Da documentação:
A mensagem a ser enviada ao destino quando o cronômetro for acionado.O seletor deve ter a seguinte assinatura:
- (void)timerFireMethod:(NSTimer*)theTimer