Swift 从另一个不相关的类更改ViewController中的UILabel

Swift 从另一个不相关的类更改ViewController中的UILabel,swift,sprite-kit,tvos,Swift,Sprite Kit,Tvos,我一直在为我的tvOS sprite kit游戏制作分数和高分显示器。我有两节课。其中一个类称为“GameViewController”,一个UIViewController,另一个是我的播放器的SKSpriteNode的子类。我想做的是每五次更新,分数就会更新。分数和高分的标签是通过my GameViewController类中的变量访问的。在我的玩家类中是更新的地方,所以我需要从我的玩家类中触发GameViewController类中的一个方法 我试过一些方法。我得到的最远的结果是使用“协议

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

我试过一些方法。我得到的最远的结果是使用“协议”和“委托”的这种方法。我有一个名为“ScoreUpdateResponder”的
协议类,它有一个方法:

scoreUpdate(让分数为Int)

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

玩家等级:

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类中。有什么帮助吗?

我在这里做一些假设

假设

  • 这个游戏中只有一个玩家,由一个单身汉代表
  • 未显示的内容负责调用player.Update()
我认为您可能遇到的问题是
let score=0
行。我认为您实际上想要做的是:
var score=0
有效地定义一个常量

我还编辑了一些代码,使其更符合常见的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++;
    }
}

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