2010-11-14 31 views
0

Je deviens désespérée. J'ai un NSTimer dans mon deuxième ViewController.Stockez le temps de NSTimer pour la prochaine vue (AIDE!)

-(IBAction)start { 
    myticker = [NSTimer scheduledTimerWithTimeInterval:0.01 
               target:self 
               selector:@selector(showActivity) 
               userInfo:nil 
               repeats:YES]; 
} 

-(IBAction)stop { 
    [myticker invalidate]; 
} 

-(void)showActivity { 
float currentTime = [time.text floatValue]; 
newTime = currentTime + 0.01; 
time.text = [NSString stringWithFormat:@"%.2f", newTime];   
} 

newTime ist une variable d'instance (float) et time est l'étiquette où l'heure est affichée.

Avant d'appeler le troisième ViewController, je stockaient le temps ceci:

-(IBAction)right { 

[self stop]; 

ThirdViewController *screen = [[ThirdViewController alloc] initWithNibName:nil bundle:nil]; 
screen.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
screen.timelabel.text = [NSString stringWithFormat: @"%.2f", newTime]; 
[self presentModalViewController:screen animated:YES]; 
[screen release]; 
} 

Je me suis arrêté la minuterie et a donné le temps de la variable d'instance timelabel (UILabel). Dans le troisième ViewController j'ai créé le même NSTimer avec les mêmes méthodes. Mais quand j'ouvre le troisième contrôleur de vue, la minuterie recommence à 0.

Qu'est-ce qui ne va pas avec mon code?


Mon troisième ViewController:

-(IBAction)start { 

    myticker = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(showActivity) userInfo:nil repeats:YES]; 

} 


-(IBAction)stop { 

    [myticker invalidate]; 

} 

-(void)showActivity { 

    float currentTime = [timelabel.text floatValue]; 
    float newTime = currentTime + 0.01; 
    timelabel.text = [NSString stringWithFormat:@"%.2f", newTime];   
} 
+1

Si vous avez des problèmes avec le troisième contrôleur d'affichage, vous devez afficher le code du troisième contrôleur d'affichage! – Yuji

Répondre

0

Tout d'abord, s'il vous plaît vous déplacer troisième code du contrôleur à la question. Vous ne retenez pas myticker. Je suis surpris que cela fonctionne du tout.

C'est une mauvaise idée de stocker des données flottantes dans un champ de texte. Il serait préférable d'utiliser la propriété float pour cela:

@interface MyController : UIViewController 
{ 
    float currentTime; 
    ... 
} 

@property (nonatomic, assign) float currentTime; 
... 

@end 

@implementation MyController 

@syntesize currentTime; 

-(IBAction)start { 
    self.myticker = [NSTimer scheduledTimerWithTimeInterval:0.01 
               target:self 
               selector:@selector(showActivity) 
               userInfo:nil 
               repeats:YES]; 
} 

-(void)showActivity { 
    currentTime += 0.01; 
    time.text = [NSString stringWithFormat:@"%.2f", currentTime];   
} 
... 

@end 
+1

La raison pour laquelle cela a fonctionné sans 'retain' est que la boucle d'exécution (à laquelle' scheduledTimer ...: 'ajoute automatiquement le temporisateur) le conserve, voir http://developer.apple.com/library/mac/documentation/ Cocoa/Conceptuel/Timers/Articles/usingTimers.html # // apple_ref/doc/uid/20000807-SW6. Je suis d'accord que c'est une mauvaise pratique de s'appuyer sur cette fonctionnalité. – Yuji