0

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

。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

米:

#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
4

3 回答 3

0

试着在里面评论你的代码- (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)player

我的猜测是,在- (IBAction)recordPauseTapped:(id)sender你打电话的时候[player stop],它会触发- (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag你的新计时器。

于 2013-08-20T01:49:59.643 回答
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];


}
于 2013-08-20T14:47:42.063 回答
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)。

于 2013-08-20T01:26:50.570 回答