2016-10-04 175 views
0

所以我一直在創建一個應用程序,如果你按下按鈕,它會觸發startGame。然後,應該等待更改每個圖像之前創建的延遲。延遲工作,但他們一開始我的應用程序啓動,而不是當我按下按鈕。自從我一直試圖修復它。有什麼建議麼?快速延遲問題

感謝您的幫助!

以下是我認爲比較重要的代碼:

let deadlineTime = DispatchTime.now() + .seconds(1) 
let deadlineTime2 = DispatchTime.now() + .seconds(2) 
let deadlineTime3 = DispatchTime.now() + .seconds(3) 
let deadlineTime4 = DispatchTime.now() + .seconds(4) 

@IBAction func startGame(_ sender: AnyObject) { 

     trumpImage.isHidden = false 

     DispatchQueue.main.asyncAfter(deadline: deadlineTime) { 

      self.trumpImage.image = UIImage(named: "trumpTurnOne") 

     } 

     DispatchQueue.main.asyncAfter(deadline: deadlineTime2) { 

      self.trumpImage.image = UIImage(named: "trumpTurnTwo") 

     } 

     DispatchQueue.main.asyncAfter(deadline: deadlineTime3) { 

      self.trumpImage.image = UIImage(named: "trumpTurnThree") 

     } 

     DispatchQueue.main.asyncAfter(deadline: deadlineTime4) { 

       self.runGame() 

     } 

} 
+0

此代碼是否在類中?它應該在你的View Controller內部。另外,請確保您已通過界面構建​​器將此方法連接到您的按鈕。 – Connor

+0

我已經完成了這兩件事,只是沒有顯示所有的代碼 – MGallo

+0

好吧,如果你顯示更多的代碼,它會更容易回答。你的調度時間變量也應該在IBAction的內部,否則它們會在控制器加載時被正確初始化,儘管這不應該觸發你的功能。你在其他地方沒有任何明確的調用'startGame'? – Connor

回答

0

試試這個:

let deadlineTime = {return DispatchTime.now() + .seconds(1)} 
let deadlineTime2 = {return DispatchTime.now() + .seconds(2)} 
let deadlineTime3 = {return DispatchTime.now() + .seconds(3)} 
let deadlineTime4 = {return DispatchTime.now() + .seconds(4)} 

如果您已聲明四個DispatchTime S作爲實例屬性,初始值的評價在生成實例時生成,而不是實際使用這些屬性的時間。這意味着DispatchTime.now()表示實例化的時間,它可能比用戶按下按鈕更早。

因此,要使DispatchTime.now()代表按下按鈕的時間,您可能需要使它們成爲計算屬性。否則,你需要把它們變成局部變量。

@IBAction func startGame(_ sender: AnyObject) { 
    let deadlineTime = DispatchTime.now() + .seconds(1) 
    let deadlineTime2 = DispatchTime.now() + .seconds(2) 
    let deadlineTime3 = DispatchTime.now() + .seconds(3) 
    let deadlineTime4 = DispatchTime.now() + .seconds(4) 

    //... 
} 
+0

哈哈現在不能嘗試,但我可以後來回到你們身上 – MGallo