暂停NSTimer /秒表

时间:2013-08-20 00:42:02

标签: ios objective-c nstimer

在我正在研究的项目中,我需要一个可以暂停并继续的秒表。到目前为止所有的基本功能都可以工作,但是我还没有办法暂停计时器并重新启动它。仅供参考,我已经检查了其他帖子,但他们没有工作。代码:

·H:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface Timer : UIViewController <AVAudioRecorderDelegate, AVAudioPlayerDelegate>
{
    AVAudioRecorder *recorder;
    AVAudioPlayer *player;
}

@property (weak, nonatomic) IBOutlet UIButton *recordPauseButton;

@property (weak, nonatomic) IBOutlet UIButton *stopButton;

@property (weak, nonatomic) IBOutlet UILabel *stopwatchLabel;


-(IBAction)recordPauseTapped:(id)sender;

-(IBAction)stopTapped:(id)sender;

 @end

的.m:

#import "Timer.h"

 @interface SongIdeasRecording ()

 @property (strong, nonatomic) NSTimer *stopWatchTimer; // Store the timer that fires     after a certain time
 @property (strong, nonatomic) NSDate *startDate; // Stores the date of the click on the start button

 @end


 @implementation Timer

 @synthesize stopButton, playButton, recordPauseButton, stopwatchLabel;

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
 {
     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
     if (self) {
     // Custom initialization
 }
     return self;
 }

 - (void)updateTimer
 {
     // Timer is 1/10 of a second so thats what we add to stopwatch
NSTimeInterval timeInterval = 0.1;

// Create a date formatter
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm:ss.SSS"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];

// Take the time currently displayed on the stopwatch and add the time interval to it
NSDate *oldDate = [dateFormatter dateFromString:self.stopwatchLabel.text];
NSDate *newDate = [oldDate dateByAddingTimeInterval:timeInterval];
//Get a string representation of the new date
NSString *timeString = [dateFormatter stringFromDate:newDate];
self.stopwatchLabel.text = timeString;
 }

 - (IBAction)recordPauseTapped:(id)sender {
     self.startDate = [NSDate date];

    // Create the stop watch timer that fires every 100 ms
    self.stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
                                                       target:self
                                                     selector:@selector(updateTimer)
                                                     userInfo:nil
                                                      repeats:YES];



    // Stop the audio player before recording
    if (player.playing) {
       [player stop];
    }

    if (!recorder.recording) {
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setActive:YES error:nil];

    // Start recording
    [recorder record];
    [recordPauseButton setTitle:@"Pause" forState:UIControlStateNormal];

    } else {

       // Pause recording
       [self.stopWatchTimer invalidate];
       self.stopWatchTimer = nil;
       [self updateTimer];
       [recorder pause];
       [recordPauseButton setTitle:@"Record" forState:UIControlStateNormal];

    }

      [stopButton setEnabled:YES];
      [playButton setEnabled:NO];
 }
 - (IBAction)stopTapped:(id)sender {
     [recorder stop];

     AVAudioSession *audioSession = [AVAudioSession sharedInstance];
     [audioSession setActive:NO error:nil];

     [self.stopWatchTimer invalidate];
     self.stopWatchTimer = nil;
     [self updateTimer];
 }

 - (void) audioRecorderDidFinishRecording:(AVAudioRecorder *)avrecorder successfully: (BOOL)flag{
     [recordPauseButton setTitle:@"Record" forState:UIControlStateNormal];

     [stopButton setEnabled:NO];
     [playButton setEnabled:YES];
 }

 - (IBAction)playTapped:(id)sender {
     if (!recorder.recording){
     player = [[AVAudioPlayer alloc] initWithContentsOfURL:recorder.url error:nil];
     [player setDelegate:self];
     [player play];
     self.startDate = [NSDate date];
     stopwatchLabel.text = @"00:00:00.000";
     self.stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
                                                           target:self
                                                         selector:@selector(updateTimer)
                                                         userInfo:nil
                                                          repeats:YES];

     }
  }

 - (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
 {
     [self.stopWatchTimer invalidate];
     self.stopWatchTimer = nil;
     [self updateTimer];
  }


 @end

3 个答案:

答案 0 :(得分:0)

在您的情况下,您使用最初按下记录按钮的NSDate来计算秒表标签的值。无法以这种方式暂停计时器,因为每次重新计算秒表标签的值时,它都会反映按下记录按钮的原始日期。我建议将此方法更改为以下内容:

 - (void)updateTimer
 {
     // Timer is 1/10 of a second so thats what we add to stopwatch
     NSTimeInterval timeInterval = 0.1;

    // Create a date formatter
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"HH:mm:ss.SSS"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];

    // Take the time currently displayed on the stopwatch and add the time interval to it
    NSDate *oldDate = [dateFormatter dateFromString:self.stopwatchLabel.text];
    NSDate *newDate = [oldDate dateByAddingTimeInterval:timeInterval];
    //Get a string representation of the new date and BOOM POW.
    NSString *timeString = [dateFormatter stringFromDate:newDate];
    self.stopwatchLabel.text = timeString;
 }

没有测试过这个,但我希望它有效。如果还存在一些语法问题,我也不会感到惊讶。另外,请确保self.stopwatchLabel.text中的字符串遵循要启动的格式(例如00:00:00.000)。

答案 1 :(得分:0)

尝试在- (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)player内注释您的代码。

我的猜测是,- (IBAction)recordPauseTapped:(id)sender你正在调用[player stop],这会触发- (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag,这会使你的新计时器失效。

答案 2 :(得分:0)

- (IBAction)recordPauseTapped:(id)sender {

     if ([stopwatchLabel.text  isEqual: @"00:00:00.000"]) {


     self.startDate = [NSDate date];

     // Create the stop watch timer that fires every 100 ms
     self.stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
                                                       target:self
                                                     selector:@selector(updateTimer)
                                                     userInfo:nil
                                                      repeats:YES];



     // Stop the audio player before recording
     if (player.playing) {
     [player stop];
    }

if (!recorder.recording) {
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setActive:YES error:nil];

    // Start recording
    [recorder record];
    [recordPauseButton setTitle:@"Pause" forState:UIControlStateNormal];

}
}else {

    // Pause recording
    [self.stopWatchTimer invalidate];
    self.stopWatchTimer = nil;
    [self updateTimer];
    [recorder pause];
    [recordPauseButton setTitle:@"Record" forState:UIControlStateNormal];

}

[stopButton setEnabled:YES];
[playButton setEnabled:NO];


}