2016-02-08 2 views
0

J'utilise une sous-classe UIView qui a une certaine CAAnimation qui serait effectuée après l'exécution d'une autre classe. Dans la classe UIView, j'utilise CADisplayLink et NSTimer pour incrémenter le CATextLayer utilisé dans l'animation. Chaque fois que je revenais au contrôleur de vue précédent après l'exécution de l'animation, il continue de tourner en arrière-plan. Quand je vais voir le contrôleur où l'animation est en train de jouer, cela me montre un nombre incorrect. Y at-il quelque chose qui ne va pas avec mon code?UIView contient NSTimer - ne pas lâcher

Dans le fichier .h,

@property (assign,nonatomic) CFTimeInterval duration; 
@property (nonatomic,strong) NSTimer *tim1; 
@property (nonatomic,strong) NSTimer *tim2; 
@property (nonatomic,strong) NSTimer *tim3; 
@property (nonatomic,strong) NSTimer *startup; 
@property (nonatomic,strong) NSTimer *starter; 
@property (nonatomic,strong) NSTimer *suspender; 
@property (nonatomic,strong) NSTimer *humansum; 
@property (nonatomic,strong) NSTimer *transportsum; 
@property (nonatomic,strong) NSTimer *wastesum; 
@property (nonatomic,strong) NSTimer *watersum; 
@property (nonatomic,strong) NSTimer *energysum; 
@property (nonatomic,strong) NSTimer *humanslowsum; 
@property (nonatomic,strong) NSTimer *transportslowsum; 
@property (nonatomic,strong) NSTimer *wasteslowsum; 
@property (nonatomic,strong) NSTimer *waterslowsum; 
@property (nonatomic,strong) NSTimer *energyslowsum; 
@property (nonatomic,strong) CADisplayLink *displayLink; 

Dans le fichier .m, // Ci-dessous le code est appelé dans une méthode

displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(tick:)]; 
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

- (void)tick:(CADisplayLink *)sender 
{ 
    duration = sender.duration; 
startup=[NSTimer scheduledTimerWithTimeInterval:(2+(0.05*duration)) target:self selector:@selector(calltheanimating_function) userInfo:nil repeats:NO]; 

if(initil==YES){ 
     // 
      humansum =[NSTimer scheduledTimerWithTimeInterval:(15.4+(0.05*duration)) target:self selector:@selector(sum1) userInfo:nil repeats:YES]; 
    } 
    else{ 
     humansum =[NSTimer scheduledTimerWithTimeInterval:13.4 target:self selector:@selector(sum1) userInfo:nil repeats:YES]; 
    } 

Dans la méthode sum1,

-(void)sum1{ 
    NSLog(@"Hvalue %f",humanvalue); 
    num11=humanvalue;// 
    CATextLayer *humanscore=self.layers[@"humanscore"]; 
    [email protected]"0"; 
    actualtext=0; 
    tmep=0; 
     humanslowsum =[NSTimer scheduledTimerWithTimeInterval:(0.7/(0.7*num11)) target:self selector:@selector(final1) userInfo:nil repeats:YES]; 

} 

Pour la mise en œuvre de la fonction d'accélération, j'utilise 75% de l'incrément comme rapide et 25% d'incrément comme lent qui est m mentionné dans l'exigence.

-(void)final1{ 
    if(tmep<round(num11)){ 
     tmep++; 
     CATextLayer *t=self.layers[@"stepscore"]; 
     int m=[t.string intValue]; 
     m++; 
     t.string=[NSString stringWithFormat:@"%d",m]; 
     CATextLayer *humanscore=self.layers[@"humanscore"]; 
     actualtext++; 
     humanscore.string=[NSString stringWithFormat:@"%d",actualtext]; 
     NSLog(@"%d",m); 
    } 
    else{ 
     [humanslowsum invalidate]; 
    } 
} 

Cette minuterie continue à fonctionner même si si j'invalider la minuterie, retirez la vue de l'intérieur superview méthode dealloc(). S'il vous plaît aidez-moi avec le problème.

+0

Êtes-vous sûr que le dealloc est appelé? Il a un cycle de retenue car la vue conserve la minuterie et le minuteur conserve la vue. –

+0

Oui, j'invalide tous les temporisateurs dans dealloc et j'ai vérifié le mode de débogage et la méthode est appelée –

+0

Pouvez-vous également imprimer les valeurs de humanslowsum? Il semble qu'il soit remplacé mais la valeur précédente n'est pas invalidée. Cela peut être la création de plusieurs minuteurs pour cette variable. –

Répondre

0

Enfin, trouvé une réponse par une méthode simple. Création d'un IBOutlet de la sous-vue uiview à l'intérieur de super vue et invalidation des NSTimer (s) là-bas tout en effectuant segue.