2015-05-19 73 views
-1
if timerRunning == false{ 
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("counting"), userInfo: nil, repeats: true) 
    timerRunning = true 
} 
while timerLabel.text != "0"{ 
gameViewStillRunning = false 
} 
if gameViewStillRunning == false{ 
    self.performSegueWithIdentifier("segue", sender: nil) 
} 

這段代碼的目的是顯示一個標籤倒數,然後當它到達0時,場景應該切換到不同的ViewController。這段代碼沒有得到任何錯誤,但是當我運行它時,程序沒有比加載屏幕更進一步。有什麼建議麼?爲什麼我的swift代碼在加載屏幕上暫停?

+0

你的意思是「加載屏幕」是什麼屏幕?你是否看到了屏幕上的標籤,你應該在這裏更新? (帶有'timerLabel'的那個?) – nhgrif

+0

應該可能包含更多的代碼,你不會在這個代碼中遞減你的計數器,應該全部顯示 –

回答

0

看起來您正在主線程上運行while循環,該線程也是負責繪製UI的線程。只要該線程停留在while循環中,它就無法繼續運行循環,並且沒有機會更新顯示或響應用戶交互。

此外,如果你看一下NSTimer文檔,您可能會注意到scheduledTimerWithTimeInterval指出它Creates and returns a new NSTimer object and schedules it on the current run loop in the default mode.該定時器在主線程的運行循環,但調度調用您的counting功能,因爲該線程被阻塞紡紗永遠在你while它永遠不會有機會執行,所以它沒有機會更新timerLabel.text

在輪詢某些情況時,不要試圖用您的while循環阻止執行,更好的解決方案是允許運行循環繼續並在計時器調用您的counting函數時作出反應。讓您的應用程序對事件做出反應(如剩餘時間的變化),而不管它們何時或如何發生,而不是試圖控制確切的執行順序。

0

的問題是,這是一個無限循環:

while timerLabel.text != "0"{ 
    gameViewStillRunning = false 
} 

環路不改變的timerLabel.text值的機構,所以條件(在第一行中的測試)保持失敗,並循環只是永遠循環 - 代碼,所以整個應用程序,只是在那一點掛起,永久停止。

+1

無限循環總是危險的,並且程序員可以犯的最基本的錯誤之一使。蘋果在加州山景城的地址是One Infinite Loop的原因之一。 – matt