2016-10-04 112 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