2012-04-21 7 views
4

J'affiche l'heure en utilisant le code suivant ... J'ai la vue déroulante dans mon viewController ... Ici, je montre l'heure commençant par 00: 00.00 (mm: ss: SS) (minutes : secondes: millisecondes) et viser incrémenter les millisecondes, secondes basées sur millisecondes, minutes basées sur secondes ... Mais je veux afficher l'heure à partir de 75: 00.00 (mm: ss: SS) et je veux décrémenter les millisecondes, secondes et minutes à 00: 00.00 (mm: ss.SS) ... Comment puis-je ..?NStimer ne fonctionne pas correctement dans iOS

Je l'ai déjà demandé ce donc, dans le lien suivant .. NSTimer Decrease the time by seconds/milliseconds

I i suivre ce code le temps ne calcule pas (en arrière-plan aussi) quand je fais glisser et maintenez-la défilante avec en libérant le mouseClick ... Aidez-moi avec les changements dans le code ci-dessous ...

enter code here 
@interface ViewController : UIViewController 
{ 
    IBOutlet UILabel *time; 
    NSTimer *stopWatchTimer; 
    NSDate *startDate; 
    NSTimeInterval secondsAlreadyRun; 
} 

- (void)reset:(id)sender; 
- (void)onStartPressed:(id)sender; 
- (void)onStopPressed:(id)sender; 


enter code here 
-(void)showActivity:(NSTimer *)tim 
{ 
    NSDate *currentDate = [NSDate date]; 

    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate]; 
    // Add the saved interval 
    timeInterval += secondsAlreadyRun; 
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval]; 
    static NSDateFormatter * dateFormatter = nil; 
    if(!dateFormatter){ 
     dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setDateFormat:@"mm:ss.SS"]; 
     [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]]; 
    } 
    NSString *timeString=[dateFormatter stringFromDate:timerDate]; 
    time.text = timeString; 

    // [dateFormatter release]; 
} 

- (void)onStartPressed:(id)sender 
{ 
    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1/10 
                 target:self 
                selector:@selector(showActivity:) 
                userInfo:nil 
                repeats:YES]; 
    // Save the new start date every time 
    startDate = [[NSDate alloc] init]; // equivalent to [[NSDate date] retain]; 
    [stopWatchTimer fire]; 
} 

- (void)onStopPressed:(id)sender 
{ 
    // _Increment_ secondsAlreadyRun to allow for multiple pauses and restarts 
    secondsAlreadyRun += [[NSDate date] timeIntervalSinceDate:startDate]; 
    [stopWatchTimer invalidate]; 
    stopWatchTimer = nil; 

    // [startDate release]; 
    // [self showActivity:stopWatchTimer]; 
} 

Répondre

11

Vous devez vous enregistrer la minuterie pour fonctionner dans NSRunLoopCommonModes

+0

Également pertinent (et ma plus grande gottcha): chaque thread a son propre objet RunLoop. [[NSRunLoop currentRunLoop] vous donnera l'objet runloop du thread actuel; et en fonction de votre code si vous ne programmez pas votre minuteur sur le fil principal, votre minuteur ne pourra jamais cocher. – pretzels1337

1
IBOutlet UILabel * result; 
NSTimer * timer;     
int currentTime; 


- (IBAction) start; 
- (IBAction) pause; 
- (void)populateLabelwithTime:(int)milliseconds; 

fichier .m

- (void)viewDidLoad 
{ 
    currentTime = 270000000; // Since 75 hours = 270000000 milli seconds 
    // ..... some codes.... 
} 
- (IBAction) start 
{ 
    timer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES]; 
} 

-(IBAction)pause 
{ 
    [timer invalidate]; 
} 

- (void)updateTimer:(NSTimer *)timer { 
    currentTime -= 10 ; 
    [self populateLabelwithTime:currentTime]; 
} 
- (void)populateLabelwithTime:(int)milliseconds 
{ 
    int seconds = milliseconds/1000; 
    int minutes = seconds/60; 
    int hours = minutes/60; 

    seconds -= minutes * 60; 
    minutes -= hours * 60; 

    NSString * result1 = [NSString stringWithFormat:@"%@%02dh:%02dm:%02ds:%02dms", (milliseconds<[email protected]"-":@""), hours, minutes, seconds,milliseconds%1000]; 
    result.text = result1; 

} 
+0

Hai ... J'ai essayé ce code ... Je ScrollView dans mon View Controller, j'Interroger l'heure dans ce contrôleur de vue. Si Glissez et maintenez la vue déroulante, le temps ne se calcule pas (en arrière-plan aussi) ... Comment puis-je ..? – SriKanth

+0

Merci !!! Cela a fonctionné pour moi .... – Aayushi

5

Les temporisateurs sont planifiés dans les boucles d'exécution dans certains modes de boucle d'exécution. Ils ne peuvent se déclencher que lorsque la boucle d'exécution est exécutée dans l'un de ces modes. Les méthodes +scheduledTimerWithTimeInterval:... planifient le temporisateur dans le mode par défaut. Le suivi des événements pendant la manipulation d'une barre de défilement utilise NSEventTrackingRunLoopMode. Vous devez programmer la minuterie sur le (s) mode (s) approprié (s).

Vous pouvez le programmer sur NSRunLoopCommonModes qui est un ensemble virtuel de modes. Les boucles d'exécution ne s'exécutent jamais dans un tel mode, mais elles s'exécutent dans des modes qui sont membres de cet ensemble. Le mode par défaut et NSEventTrackingRunLoopMode sont ajoutés à cet ensemble, tout comme NSModalPanelRunLoopMode.

Questions connexes