2012-03-01 12 views
6

mam ten kod:NSTimer userInfo. Jak obiekt przechodzi do selektora?

-(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; 
} 

cel jest rozpocząć obracanie widoku podczas gdy użytkownik trzyma guzik. Gdy użytkownik zwolni, timer się zatrzyma.

Ale daję to:

- [__ NSCFTimer intValue]: nierozpoznany selektor wysyłane do instancji 0x4ae360

Ale jeśli mam paasing w userinfo klasy NSNumber, dlaczego ja” m odbierający timer?

Dzięki.

Odpowiedz

25

Twoja metoda działania timera powinien wyglądać ten

-(void)rotateSelectedItem:(NSTimer*)sender 

można uzyskać na userinfo wykonując

NSNumber *userInfo = sender.userInfo; 
2

Źle zrozumiałeś sygnaturę selektora, który rejestrujesz przy użyciu licznika czasu. Nadawca jest NSTimer*, a nie przedmiot userinfo które przechodzą do konstruktora:

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

Z dokumentacji:

Wiadomość do wysłania do celu po uruchomieniu timera. Selektor musi mieć następującą sygnaturę:

- (void)timerFireMethod:(NSTimer*)theTimer