Ed3121577
Ed3121577

Reputation: 520

NSTimer with NSUserDefaults

How do I have an NSTimer with a UIButton that changes its text from Start to Stop, Also another UIButton will be added to pause the timer. So, You press start and then the timer will show in a label in hours, minutes and seconds. While the timer is running, is there a way to pause the timer ( I heard you have to use NSUserDefaults). Also is there a way to save the time at which the start button was pressed and then to save the time that the button was pressed again to stop? Also when the pause button is pressed to pause the timer and when pause is pressed again it will resume the timer?

Upvotes: 0

Views: 658

Answers (2)

Joseph Chen
Joseph Chen

Reputation: 1530

If you need a timer that doesn't support pausing, you only need to know the NSDate at which the timer started so that you can calculate the time elapsed. Create an instance variable:

@property (strong, nonatomic) NSDate *timerStartDate;

When the button is tapped:

- (void)startTimer
{
    self.timerStartDate = [NSDate date];
}

Your NSTimer is not to keep track of the time, but to periodically update the label. Create an instance variable:

@property (strong, nonatomic) NSTimer *labelUpdateTimer;

and update the -startTimer method:

- (void)startTimer
{
    self.timerStartDate = [NSDate date];

    // start timer to update label
    if (!self.labelUpdateTimer) {
        self.labelUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                                      target:self
                                                    selector:@selector(updateLabel)
                                                    userInfo:nil
                                                     repeats:YES];
    }
}

- (void)updateLabel
{
    NSTimeInterval secondsElapsedSinceTimerStart = 0;
    if (self.timerStartDate) {
        secondsElapsedSinceTimerStart = [[NSDate date] timeIntervalSinceDate:self.timerStartDate];
    }

    NSString *formattedTime = <format time elapsed the way you like>;
    self.label.text = formattedTime;
}

- (void)dealloc
{
    // make sure timer is not firing anymore!
    if (_labelUpdateTimer) {
        [_labelUpdateTimer invalidate];
        _labelUpdateTimer = nil;
    }
}

However, if you want to be able to pause the timer, besides calculating the time elapsed since the timer last started, you'll need to store the time previously elapsed (if you started/paused the timer before). Create an instance variable:

@property (nonatomic) NSTimeInterval previouslyElapsedSeconds;

And when you pause the timer:

- (void)pauseTimer
{
    // update elapsedSeconds
    if (self.timerStartDate) {
        self.previouslyElapsedSeconds += [[NSDate date] timeIntervalSinceDate:self.timerStartDate];
        self.timerStartDate = nil;
    }

    [self.labelUpdateTimer invalidate];
    self.labelUpdateTimer = nil;
}

Update -updateLabel:

- (void)updateLabel
{
    NSTimeInterval secondsElapsedSinceTimerStart = 0;
    if (self.timerStartDate) {
        secondsElapsedSinceTimerStart = [[NSDate date] timeIntervalSinceDate:self.timerStartDate];
    }

    // account for previously elapsed time
    NSTimeInterval totalSecondsElapsed = self.previouslyElapsedSeconds + secondsElapsedSinceTimerStart;

    NSString *formattedTime = <format time elapsed the way you like>;
    self.label.text = formattedTime;
}

NSUserDefaults will be required only if you want to keep timing even if the app is shut down (not just backgrounded). In that case store previouslyElapsedSeconds and timerStartDate in NSUserDefaults instead of as instance variables.

Upvotes: 2

Jeff Wolski
Jeff Wolski

Reputation: 6382

assuming you have NSDate objects startTime and stopTime

[[NSUserDefaults standardUserDefaults] setObject:startTime forKey:@"startTime"];
[[NSUserDefaults standardUserDefaults] setObject:stopTime forKey:@"stopTime"];

Or you can use floats startTimef and stopTimef

[[NSUserDefaults standardUserDefaults] setFloat:startTimef forKey:@"startTime"];
[[NSUserDefaults standardUserDefaults] setFloat:stopTimef forKey:@"stopTime"];

Check out the NSUserDefaults docs.

Here's a great set of tutorials.

Upvotes: 0

Related Questions