2014-04-15 3 views
0

저는 기본 스톱워치를 만들고 있지만, 타이머를 시작할 때마다 중지를 클릭하고 타이머를 계속 다시 시작하려면 시계가 0에서 다시 시작됩니다. obj-c/Xcode를 선택했을 때와 마찬가지입니다.스톱워치 시작 버튼은 타이머를 재설정합니다

#import "StopwatchViewController.h" 

bool stopPressed = false; 
bool startPressed = false; 
int startsPressed = 0; 
NSTimeInterval totalTimeInterval; 

@interface StopwatchViewController() 

@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 StopwatchViewController 

- (void)updateTimer 
{ 
    NSDate *currentDate = [NSDate date]; 
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate: self.startDate]; 
    totalTimeInterval = timeInterval; 
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:totalTimeInterval]; 

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

    NSString *timeString = [dateFormatter stringFromDate:timerDate]; 
    self.stopwatchLabel.text = timeString; 



} 



- (IBAction)onStartPressed:(id)sender 
{ 
    if(startsPressed < 1) { 
     if(startPressed) return; 
     startPressed = true; 
     stopPressed =false; 
     self.startDate = [NSDate date]; 

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

     startPressed = true; 
     stopPressed = false; 

    } 
} 


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

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 


- (IBAction)onStopPressed:(id)sender { 
    if(stopPressed) return; 
    stopPressed = true; 
    startPressed = false; 
    [self.stopWatchTimer invalidate]; 
    self.stopWatchTimer = nil; 
    [self updateTimer]; 
} 

- (IBAction)onResetPressed:(id)sender { 
    if(stopPressed == false) return; 
    self.stopWatchTimer = 0; 
    NSString *timeString = @"00:00:00.000"; 
    self.stopwatchLabel.text = timeString; 
} 


@end 

내 시작은

#import "StopwatchViewController.h" 

    bool stopPressed = false; 
    bool startPressed = false; 
    int startsPressed = 0; 
    NSTimeInterval totalTimeInterval; 

    @interface StopwatchViewController() 

    @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 
    @property (nonatomic, strong) NSDate *pauseDate; 

    @end 

    @implementation StopwatchViewController 

    - (void)updateTimer 
    { 
     NSDate *currentDate = [NSDate date]; 
     NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate: self.startDate]; 
     totalTimeInterval = timeInterval; 
     NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:totalTimeInterval]; 

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

     NSString *timeString = [dateFormatter stringFromDate:timerDate]; 
     self.stopwatchLabel.text = timeString; 



    } 



    - (IBAction)onStartPressed:(id)sender 
    { 
    // if(startsPressed < 1) { 
    //  if(startPressed) return; 
    //  startPressed = true; 
    //  stopPressed =false; 
    //  self.startDate = [NSDate date]; 
    //   
    //  //create the stop watch timer that fires every 100ms 
    //  self.stopWatchTimer = 
    //  [NSTimer scheduledTimerWithTimeInterval:1.0/100.0 
    //           target:self 
    //          selector:@selector(updateTimer) 
    //          userInfo:nil 
    //          repeats:YES]; 
    // } else { 
    //   
    //  startPressed = true; 
    //  stopPressed = false; 
    //   
    // } 

     if(startsPressed < 1) { 
      if(! _startDate) { 
       self.startDate = [NSDate date]; 
      } 
      else { 
       if(_pauseDate) { 
        NSTimeInterval startTime = _startDate.timeIntervalSince1970; 
        NSTimeInterval pauseTime = _startDate.timeIntervalSince1970; 

        // the actual elapsed time before we paused 
        NSTimeInterval elapsedTime = pauseTime - startTime; 

        // set a new start time to match our elapsed time. 
        NSTimeInterval currentTime = [NSDate date].timeIntervalSince1970; 
        NSTimeInterval newStartTime = currentTime - elapsedTime; 
        _startDate = [NSDate dateWithTimeIntervalSince1970:newStartTime]; 
        _pauseDate = nil; 
       } 
      } 


     } 
    } 


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

    - (void)viewDidLoad 
    { 
     [super viewDidLoad]; 
     // Do any additional setup after loading the view. 
    } 

    - (void)didReceiveMemoryWarning 
    { 
     [super didReceiveMemoryWarning]; 
     // Dispose of any resources that can be recreated. 
    } 


    - (IBAction)onStopPressed:(id)sender { 
     if(stopPressed) return; 
     _pauseDate = [NSDate date]; 
     stopPressed = true; 
     startPressed = false; 
     [self.stopWatchTimer invalidate]; 
     self.stopWatchTimer = nil; 
     [self updateTimer]; 
    } 

    - (IBAction)onResetPressed:(id)sender { 
     if(stopPressed == false) return; 
     _startDate = nil; 
     _pauseDate = nil; 
     self.stopWatchTimer = 0; 
     NSString *timeString = @"00:00:00.000"; 
     self.stopwatchLabel.text = timeString; 
    } 


    @end 
+0

에서 발생합니다.이 줄의 위치는 다음과 같습니다. totalTimeInterval = timeInterval; 현재 합계에 새 시간 간격을 추가하는 대신 totalTimeInterval을 매번 재설정합니다. –

+0

@VladimirPopko 코드가 문제가되지 않습니다.'totalTimeInterval'은 시작 시간과 현재 시간의 차이를 의미합니다. 문제는 타이머가 실행될 때마다 시작 시간이 재설정된다는 것입니다. – Dima

답변

0

당신이 "시작"을 누를 때마다,이 코드가 실행됩니다이 시점에서 현재 생각은 :

self.startDate = [NSDate date]; 

이것은 당신이 시작 시간을 재설정 사용. 타이머를 시작할 때마다 대신 한 번만 발생하도록 결과를 어딘가에 옮기십시오. 결과가 원하는대로 가까워 질 것이라고 생각합니다. 아마도 처음으로 타이머가 시작될 때 여분의 BOOL을 저장할 수 있습니다.

편집 : 내가 간과 Stonz2에 의해 제기

아주 좋은 지적. 이렇게하면 백업을 시작하면 건너 뛸 시간이 생깁니다. 이 문제를 해결하려면 타이머를 중지 할 때 "일시 중지"시간을 나타 내기 위해 별도의 NSDate을 저장해야합니다. 그런 다음 타이머를 다시 시작할 때 "시작"시간에 "일시 중지됨"시간을 추가하여 연속성이 유동적이어야합니다.

Edit2가 :

나는 프로젝트에이 던져 버리고 여기에 몇 가지 작업 코드입니다. 나는 일시 정지 시간 초기화이 추가, onStopPressed:에서

@property (nonatomic, strong) NSDate *pauseDate; 

:

내가 추가 속성을 추가 onStartPressed:에, 그리고

_pauseDate = [NSDate date]; 

을, 나는 한을 보장하기 위해 다음 코드를 추가 startDate 초기화 및 일시 중지 후 경과 시간을 얻기위한 수학 계산 :

// if we have a start date, don't initialize again 
    if(! _startDate) 
    { 
     self.startDate = [NSDate date]; 
    } 
    else 
    { 
     if(_pauseDate) 
     { 
      NSTimeInterval startTime = _startDate.timeIntervalSince1970; 
      NSTimeInterval pauseTime = _pauseDate.timeIntervalSince1970; 

      // The actual elapsed time before we paused. 
      NSTimeInterval elapsedTime = pauseTime - startTime; 

      // Set a new start time to match our elapsed time. 
      NSTimeInterval currentTime = [NSDate date].timeIntervalSince1970; 
      NSTimeInterval newStartTime = currentTime - elapsedTime; 
      _startDate = [NSDate dateWithTimeIntervalSince1970:newStartTime]; 
      _pauseDate = nil; 
     } 
    } 
,451,515,

또한, onResetPressed:에, 제대로 재설정 작업을하기 위해 당신은 추가해야합니다

_startDate = nil; 
_pauseDate = nil; 

그냥이 테스트는 챔피언처럼 작동합니다.

EDIT3 : 코멘트 스레드

- (IBAction)onStartPressed:(id)sender 
{ 
    if(startsPressed < 1) { 
     if(startPressed) return; 
     startPressed = true; 
     stopPressed =false; 
     if(! _startDate) 
     { 
      self.startDate = [NSDate date]; 
     } 
     else 
     { 
      if(_pauseDate) 
      { 
       NSTimeInterval startTime = _startDate.timeIntervalSince1970; 
       NSTimeInterval pauseTime = _pauseDate.timeIntervalSince1970; 
       NSTimeInterval elapsedTime = pauseTime - startTime; 
       NSTimeInterval currentTime = [NSDate date].timeIntervalSince1970; 
       NSTimeInterval newStartTime = currentTime - elapsedTime; 
       _startDate = [NSDate dateWithTimeIntervalSince1970:newStartTime]; 
       _pauseDate = nil; 
      } 
     } 

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

     startPressed = true; 
     stopPressed = false; 

    } 
} 
+0

Tom이 총 시간을 똑같이 계산하면 "현재 시간 - 시작 시간"을 계산할 때 "일시 중지"시간을 제외하지 않습니다. – Stonz2

+0

@ Stonz2 그건 좋은 지적이야, 내 대답에 대한 고려 사항을 추가 할 것입니다. – Dima

+0

@Dima 아마도이 코드를 적용한 후에 시작을 클릭해도 아무 일도 일어나지 않기 때문에 나는 뭔가 잘못하고 있습니다. – tbreinhart

0

당신이 onStartPressed 방법 self.startDate을 재설정하기 때문에이 당 전체 방법. 이 작업은 viewDidLoad:onResetPressed:

관련 문제