【问题标题】:Mutating UILabels in the ViewController from another unrelated class从另一个不相关的类中改变 ViewController 中的 UILabel
【发布时间】:2016-01-03 02:40:25
【问题描述】:

我一直在为我的 tvOS sprite kit 游戏制作分数和高分显示。我有两节课。其中一个类称为“GameViewController”,一个 UIViewController,另一个是我的玩家的 SKSpriteNode 的子类。我想要做的是每五次更新,分数就会更新。分数和高分的标签通过我的 GameViewController 类中的变量访问。在我的 Player 类中是完成更新的地方,所以我需要在我的 GameViewController 类中触发一个方法我的 Player 类。

我已经尝试了一些方法。我得到的最远的方法是使用“协议”和“代表”的这种方法。我有一个名为“ScoreUpdateResponder”的protocol 类,它有一个方法:

scoreUpdate(let score: Int)

因此,我的 GameViewController 实现了(?我是一名 Java 开发人员,试图在这里连接点) Responder 类。所以我的精简类结构如下所示:

玩家类:

class Player: SKSpriteNode
{
    weak var responder: ScoreUpdateResponder?

    init(responder : ScoreUpdateResponder) 
    {
        self.responder = responder
    }

    let score = 0

    func update()
    {
      if(score % 5 == 0)
      {
        responder?.updateScore(score / 5)
      }

      score++;
    }
}

** ScoreUpdateResponder 类**

protocol ScoreUpdateResponder : class
{
    func updateScore(let score: Int)

}

然后我的 GameViewController 是:

class GameViewController: UIViewController, ScoreUpdateResponder
{
  func updateScore(score: Int)
  {
    scoreValue.text = String(score)

    if(score > Int.init(highscoreValue.text!)!)
    {
      highscoreValue.text = String(score)
    }
  }
}

我知道我一定错过了什么。我怀疑它与我对响应者的初始化有关,或者更普遍地在 Player 类中。有什么帮助吗?

【问题讨论】:

  • 看起来您的初始化设置不正确,如果缺少代码,请使用 ... 让人们知道那里应该有东西
  • 你在做super.init吗?因为现在你在技术上没有一个 SKSpriteNode,这让我觉得这里的 init 甚至没有被调用,所以你的响应者是 nil
  • 我不确定如何设置 init。我尝试使用 NSCoder 参数制作一个,但这让我需要使用 NSCoder 参数初始化播放器——这是我不想做的事情。

标签: swift sprite-kit tvos


【解决方案1】:

我将在这里做一些假设。

假设

  • 此游戏中只有一个玩家,由单例表示
  • 未显示的内容负责调用 player.Update()

我认为您可能遇到的问题是let score = 0 行。我认为您实际上要做的是:var score = 0let 有效地定义了一个常量。

我还编辑了一些代码,使其更符合常见的 swift 样式指南。

class GameViewController: UIViewController {

    @IBOutlet private weak var scoreValue: UILabel!
    @IBOutlet private weak var highscoreValue: UILabel!

    var player = Player()

    override func viewDidLoad() {
        super.viewDidLoad()
        player.delegate = self
    }

    ...

}

// MARK: PlayerDelegate
extension GameViewController: PlayerDelegate {

    func playerDidUpdateScore(score: Int) {
        self.scoreValue.text = String(score)

        guard let highScoreText = highscoreValue.text, highScore = Int(highScoreText) where score > highScore else {
                return
        }

        self.highscoreValue.text = String(score)
    }
}

protocol PlayerDelegate {
    func playerDidUpdateScore(score: Int)
}

class Player: SKSpriteNode {

    var delegate: PlayerDelegate?
    static var score = 0

    func update() {
        if self.score % 5 == 0 {
            self.delegate?.playerDidUpdateScore(self.score / 5)
        }

        self.score++;
    }
}

【讨论】:

  • 感谢您的帮助。我会在以后的情况下使用它。
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
相关资源
最近更新 更多