NSTimer()的范围

时间:2016-05-11 22:06:59

标签: swift nstimer

我的问题:在一个函数中声明的NSTimer()会影响另一个函数。

我正在制作一个简单的RPG游戏,允许两个玩家互相对抗。游戏有一个文本字段,显示一秒消息,例如“玩家一次攻击”等。游戏结束后,文本字段应打印获胜者并将消息保留在文本域。为了解决第一部分(显示一条消息,在一秒钟后显示一个空字符串),我制作了以下代码:

    func printEmpty() {
    textToDisplayLabel.text = ""
}
    func announcer(player: Character) {
    var timer = NSTimer()
    textToDisplayLabel.text = "\(player.name) attacks"
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "printEmpty", userInfo: nil, repeats: false)

}

要解决第二部分(显示有关获胜者的信息并将其保留在文本字段中),我使用了:

    func hideAfterAPlayerHasWon(winner: Character) {
    leftPlayerAttackButton.hidden = true
    rightPlayerAttackButton.hidden = true
    leftPlayerHpLabel.hidden = true
    rightPlayerHpLabel.hidden = true
    leftPlayerNameLabel.hidden = true
    rightPlayerNameLabel.hidden = true

    if winner.side == Character.playerSide.left {
        soldierMain.hidden = true
        let centerXConst = NSLayoutConstraint(item: orcMain, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 1)
        let centerYConst = NSLayoutConstraint(item: orcMain, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1, constant: 1)
        self.view.addConstraint(centerXConst)
        self.view.addConstraint(centerYConst)
        textToDisplayLabel.text = "\(leftPlayer.name) has won"

    } else {
        orcMain.hidden = true
        let centerXConst = NSLayoutConstraint(item: soldierMain, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 1)
        let centerYConst = NSLayoutConstraint(item: soldierMain, attribute: .CenterY, relatedBy: .Equal, toItem: self.view, attribute: .CenterY, multiplier: 1, constant: 1)
        self.view.addConstraint(centerXConst)
        self.view.addConstraint(centerYConst)
        textToDisplayLabel.text = "\(rightPlayer.name) has won"
    }

}

问题在于,当游戏开始时,会显示有关操作的信息,例如“玩家攻击”等,并在一秒钟之后隐藏,因为我希望他们这样做,但有关获胜者的信息表现得像这样甚至认为计时器只在播音员函数中声明。所以我遇到了一个问题:NSTimer()的范围是什么?我应该如何解决这个问题呢?

编辑:这是播放播音员的功能(以及hideAfter ......)

@IBAction func onLeftPlayerAttackPressed(sender: UIButton) {
    if leftPlayer.type == Character.charType.orc {
        playOrcSlash()
    }
    if leftPlayer.type == Character.charType.soldier {
        playSoldierSlash()
    }
    announcer(leftPlayer)
    updateHp(leftPlayer, defender: rightPlayer)
    disableButton(leftPlayerAttackButton)
    if !(rightPlayer.isAlive) {
        hideAfterAPlayerHasWon(leftPlayer)
    }
}

2 个答案:

答案 0 :(得分:0)

  

NSTimer()

的范围是什么

它没有"范围"。一旦你安排了它,它就属于拥有它的NSRunLoop并负责解雇它。如果它是一个非重复的计时器,它在被解雇后就会不再存在。

这与你的问题无关。你有一个基本的逻辑错误:

  1. onLeftPlayerAttackPressed设置计时器(announcer(leftPlayer))并调用hideAfterAPlayerHasWon

  2. 然后hideAfterAPlayerHasWon让玩家赢了"在标签中。

  3. 然后计时器再次触发并清空标签!

答案 1 :(得分:0)

确实,您的计时器会在您的标签更新后触发,您可以做什么:

将您的功能hideAfterAPlayerHasWon的通话延迟一到两秒,以确保您的计时器已经被解雇。

if !(rightPlayer.isAlive) {
  let yourDelayTime = (Int64(NSEC_PER_SEC) * NUMBER_SECOND_DELAY)
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, yourDelayTime), dispatch_get_main_queue(), { () -> Void in
   self.hideAfterAPlayerHasWon(leftPlayer)
  })  
}
相关问题