2013-05-22 36 views
0

目前我正在開發一個遊戲,需要停止觀看說1分鐘,當用戶點擊播放按鈕時,它進入遊戲屏幕,我想跑秒錶倒計時1分鐘01:00,00:59,00:58等。出於這個原因,我搜索並發現NSTimer將是實現秒錶的理想選擇。因此,我拿了一個標籤,創建了一個NSTimer實例,分配了時間間隔並開始遞減在定時器標籤的值,即:重置NSTimer後導航到另一個視圖

-(void)viewDidAppear:(BOOL)animated 
{ 
    self.stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(viewWillAppear:) userInfo:nil repeats:YES]; 
    [super viewDidAppear:YES]; 
} 

-(void)viewWillAppear:(BOOL)animated 
{ 
    static int currentTime = 60; 
    int newTime = currentTime--; 
    int minutesRemaining = newTime/60; // integer division, truncates fractional part 
    int secondsRemaining = newTime % 60; // modulo division 

    self.timerLabel.text = [NSString stringWithFormat:@"%02d:%02d", minutesRemaining, secondsRemaining]; 

    if ([self.timerLabel.text isEqualToString:@"00:00"]) 
    { 
     [stopWatchTimer invalidate]; 
    } 
    [super viewWillAppear:YES]; 
} 

這裏的問題是定時器開始運行01:00,00:59,00:58和推移,在第53屆說第二,我瀏覽到另外的看法,來回來,它是從00:53,00:52等等運行的,但是我希望它從01:00開始運行在我實現無效的NSTimer在viewDidDisappear,即

-(void)viewDidDisappear:(BOOL)animated 
{ 
    if ([stopWatchTimer isValid]) 
    { 
     [stopWatchTimer invalidate]; 
     self.stopWatchTimer = nil; 
    } 
    [super viewDidDisappear:YES]; 
} 

仍存在相同的問題!

在這個問題上做了大量的研究,發現沒有有用的答案和工作。

有人可以指導我,任何幫助表示讚賞。

感謝每一個提前:)

回答

1

您是使用選擇viewWillAppear定時器。 viewWillAppear是視圖出現在屏幕上時調用的viewController上的一種方法,您不應該自己調用它。相反,創建你自己的方法遞減計時器:

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    self.stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES]; 
    currentTime = 60; // This could be an instance variable 
    self.timerLabel.text = @"01:00"; 
} 


-(void)updateTime { 
    int newTime = currentTime--; 
    int minutesRemaining = newTime/60; // integer division, truncates fractional part 
    int secondsRemaining = newTime % 60; // modulo division 

    self.timerLabel.text = [NSString stringWithFormat:@"%02d:%02d", minutesRemaining, secondsRemaining]; 

    if ([self.timerLabel.text isEqualToString:@"00:00"]) 
    { 
     [self.stopWatchTimer invalidate]; 
    } 
} 

-(void)viewDidDisappear:(BOOL)animated 
{ 
[super viewDidDisappear:animated]; 
    if ([self.stopWatchTimer isValid]) 
    { 
    [self.stopWatchTimer invalidate]; 
    self.stopWatchTimer = nil; 
    } 
} 

利用這種技術定時器負責調用每一秒,但你可能會在幾秒鐘後時序問題。要獲得更準確的時間,您應該存儲開始倒計時的時間,然後每次撥打updateTime,然後將當前時間與存儲的開始時間進行比較。

添加到您的接口:

@property (nonatomic) NSTimeInterval startTime; 

然後在執行:

-(void)viewDidAppear:(BOOL)animated 
{ 
    self.startTime = [NSDate timeIntervalSinceReferenceDate]; 
    self.duration = 60; // How long the countdown should be 
    self.stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 
                  target:self 
                 selector:@selector(updateTime) 
                 userInfo:nil 
                  repeats:YES]; 
    self.timerLabel.text = @"01:00"; // Make sure this represents the countdown time 
} 

-(void)updateTime { 

    int newTime = self.duration - (round([NSDate timeIntervalSinceReferenceDate] - self.startTime)); 
    int minutesRemaining = newTime/60; // integer division, truncates fractional part 
    int secondsRemaining = newTime % 60; // modulo division 

    self.timerLabel.text = [NSString stringWithFormat:@"%02d:%02d", minutesRemaining, secondsRemaining]; 

    if (newTime < 1) 
    { 
    [self.stopWatchTimer invalidate]; 

    /* Do more stuff here */ 

    } 
} 

-(void)viewDidDisappear:(BOOL)animated 
{ 
[super viewDidDisappear:animated]; 
    if ([self.stopWatchTimer isValid]) 
    { 
    [self.stopWatchTimer invalidate]; 
    self.stopWatchTimer = nil; 
    } 
} 

一些額外的(無關)評論的代碼:

實現 viewDidDisappear:

傳遞animated參數超級電話: [super viewDidDisappear:animated];實施viewDidAppear:當 傳遞animated參數來調用超,也確保你做其他任何事情

+0

完美馬塞爾之前調用超第一本的方法,它的工作,但唯一的問題是標籤顯示的是以前的時間說00:51,然後更改爲01:00和計時器工作正常,但我不希望以前的時間是可見的,當我回到視圖。謝謝:) –

+0

我已更新示例代碼。確保在視圖出現時立即在標籤上設置文本。 – Marcel

+0

它工作的馬塞爾,但有一個輕微的修改您的答案,這將使其工作沒有任何問題,我打算編輯你的答案,我可以嗎? –

相關問題