2017-03-23 41 views
1

dans mon application J'ai un UIProgressView qui montre le temps écoulé entre deux NSDate. Tout fonctionne correctement, chaque minute qui passe UIProgressView avance de 0,1 par minute.Soustraire 1 minute entre deux NSDate

La différence entre les deux dates est calculé de cette manière avec un CGFloat

plus que j'ai un UIButton il devrait avoir la fonction de « diminuer la ProgressView 0,1 » en quelques mots à chaque fois que le bouton est enfoncé Je voudrais prendre une minute pour faire la différence entre les deux NSDate que j'ai créés précédemment. J'ai fait quelques tentatives mais je n'arrive pas à l'obtenir car quand mon application est fermée puis rouverte, le décalage horaire entre les deux dates ne change pas ... comment puis-je faire ça?

je vous montre le code que je utilise

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    [self startDate]; 
} 

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    [self upgradeEnergyBar]; 
    [NSTimer scheduledTimerWithTimeInterval: (1 * 60) 
            target:self 
            selector:@selector(upgradeEnergyBar) 
            userInfo:nil 
            repeats:YES]; 
} 

-(void)startDate { 
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
    if (! [defaults boolForKey:@"notFirstRun"]) { 
     NSDate *date = [NSDate new]; 
     [[NSUserDefaults standardUserDefaults] setObject:date forKey:@"open"]; 
     NSLog(@"Ora di apertura : %@", date); 
     [defaults setBool:YES forKey:@"notFirstRun"]; 
    } 
} 

- (IBAction)sfAction:(id)sender { 
    //Decrement CGFLOAT 
} 

-(void)upgradeEnergyBar { 
    self.now = [NSDate new]; 
    NSDate *lastDate = [[NSUserDefaults standardUserDefaults] objectForKey:@"open"]; 
    NSTimeInterval timeInterval = [self.now timeIntervalSinceDate:lastDate]; 
    _minutes = timeInterval/60; 

    _energyBar.progress = _minutes * 0.1; 
    [self updateLabelEnergyWithProgress:_energyBar.progress]; 
    _minute.text = [NSString stringWithFormat:@"MINUTES:%ld", (long) _minutes]; 


    NSLog(@"MINUTES:%ld", (long) _minutes); 

    if (_energyBar.progress == 1) NSLog(@"end"); 
} 

Répondre

1

Vous semblez avoir quelques questions là-dedans, mais pour répondre à votre « comment Soustraire une minute » ...

Qu'est-ce que vous Vraiment vouloir faire est AJOUTER une minute à votre date enregistrée. Donc, sur sfAction: vous pouvez:

- (IBAction)sfAction:(id)sender { 

    // get the 'saved' date/time 
    NSDate *lastDate = [[NSUserDefaults standardUserDefaults] objectForKey:@"open"]; 

    // add one minute (60 seconds) 
    lastDate = [lastDate dateByAddingTimeInterval:60]; 

    // get the current date/time 
    NSDate *now = [NSDate date]; 

    // use the earlier date/time (to avoid a date/time in the future) 
    NSDate *earlier = [lastDate earlierDate:now]; 

    // save it back to User Defaults 
    [[NSUserDefaults standardUserDefaults] setObject:earlier forKey:@"open"]; 

} 

Edit: Cela inclut maintenant le code pour vous assurer que nous ne sommes pas la date d'enregistrement incrémentant/heure pour être postérieure à la date/heure.

Side note ...

Il est vraiment pas une bonne idée de lire en permanence/écriture par défaut de l'utilisateur.

Vous devriez lire les valeurs lors du lancement de votre application (ou peut-être aussi quand elle revient au premier plan) et enregistrer les valeurs dans les variables/propriétés. Lorsque votre application quitte (ou est en arrière-plan), vous pouvez écrire les valeurs mises à jour.

+0

Fonctionne parfaitement ... Maintenant je cpaito mon erreur ... le problème est que je ne sauve pas ma peau à nouveau le nouveau NSUserDefault .. Je veux poser une question ... Le code fonctionne bien quand j'ouvre et ferme mon app maintenant les minutes changent ... mais pourquoi démarrer mon application de XCode ne pas le fermer par ipad les minutes ne changent pas? – kAiN

+0

Vous .. pour la valeur négative I Fixé de cette manière if (bar.progress == 0) return; pouvez-vous me dire si et The Way pour éviter la valeur négative? – kAiN

+0

J'ai édité ma réponse pour montrer une manière d'éviter le problème de temps négatif/futur. Je ne suis pas vraiment sûr de ce que votre autre question est si ... – DonMag