在显示更新之前执行的Swift代码

时间:2016-02-08 12:40:36

标签: ios swift

所以我刚开始尝试使用swift进行编码,我正在创建一个非常基本的应用程序(纯粹是为了实验和学习),点击一个按钮,屏幕上会出现两张扑克牌。 我试图得到它,以便当两张扑克牌相同时,再次播放的按钮禁用,程序暂停几秒钟,然后按钮重新启用(以后我可以添加一些“赢”文字在暂停期间)。

现在按钮和暂停功能完全适用于一个问题。测试时,程序暂停,然后当它完成暂停显示时,然后更新以显示两张卡相同。但是当它暂停时,它会显示两张随机不相等的牌。

我不确定为什么,在我检查它们是否相等之前看到卡更新,但我是新手(确实是最近几天)所以不确定它是如何工作的。

有什么想法吗? :)

@IBAction func playRoundTapped(sender: UIButton) {
    // Change the card image each time the play button is pressed using a random number generator
    self.firstCardImageView.image = UIImage(named: String(format: "card%i", arc4random_uniform(13)+1))
    self.secondCardImageView.image = UIImage(named: String(format: "card%i", arc4random_uniform(13)+1))

    // Check if the cards are equal
    if firstCardImageView.image == secondCardImageView.image && firstCardImageView.image != "card" {
        playRoundButton.userInteractionEnabled=false;
        NSThread.sleepForTimeInterval(4)
        playRoundButton.userInteractionEnabled=true;
    }
}

3 个答案:

答案 0 :(得分:1)

不要在主线程中睡觉,因为这会停止与您的应用的所有互动。您需要替换:

NSThread.sleepForTimeInterval(4)
playRoundButton.userInteractionEnabled=true;

使用:

let enableTime = dispatch_time(DISPATCH_TIME_NOW, Int64(4 * Double(NSEC_PER_SEC)))
dispatch_after(enableTime, dispatch_get_main_queue()) {
    playRoundButton.userInteractionEnabled=true;
}

答案 1 :(得分:0)

首先,一个更好的解决方案根本就是暂停并使用dispatch_after在4秒后更改playRoundButton按钮状态。

如果您想坚持暂停,那么您应该留出时间让UI在暂停之前自行更新。如,

dispatch_async(dispatch_get_main_thread(), {
  //Check if both cards are equal
  if firstCardImageView.image == secondCardImageView.image && firstCardImageView.image != "card" {
      playRoundButton.userInteractionEnabled=false;
      NSThread.sleepForTimeInterval(4)
      playRoundButton.userInteractionEnabled=true;
  }
});

事实是,当您为按钮分配新图像时,该按钮实际上仅在下一个运行循环周期重绘在屏幕上,因此如果您在运行之前暂停,则无法看到任何视觉变化。

请注意,暂停主线程会使您的应用在该时间段内无响应。

答案 2 :(得分:0)

您正在比较两个UIImage实例,这些实例不适用于==,因为它只会比较指针。在您的情况下,比较生成这些图像的数字要容易得多。

除此之外,你正在暂停主线程,它负责更新用户界面,因此它实际上没有机会这样做。解决此问题的一种方法是使用NSTimer

@IBAction func playRoundTapped(sender: UIButton) {
    let firstNumber = arc4random_uniform(13) + 1
    let secondNumber = arc4random_uniform(13) + 1

    firstCardImageView.image = UIImage(named: "card\(firstNumber)")
    secondCardImageView.image = UIImage(named: "card\(secondNumber)")

    if firstNumber == secondNumber {
        playRoundButton.userInteractionEnabled = false;
        NSTimer.scheduledTimerWithTimeInterval(4.0, target: self, selector: "enableButton", userInfo: nil, repeats: false)
    }
}

func enableButton() {
    playRoundButton.userInteractionEnabled = true;
}