gpt4 book ai didi

swift - 从另一个不相关的类改变 ViewController 中的 UILabels

转载 作者:行者123 更新时间:2023-11-28 06:52:15 27 4
gpt4 key购买 nike

我一直在为我的 tvOS sprite 套件游戏开发得分和高分显示。我有两个类(class)。其中一个类称为“GameViewController”,一个 UIViewController,另一个是我的播放器的 SKSpriteNode 的子类。我想要做的是每五次更新,分数就会更新。分数和高分的标签是通过我的 GameViewController 类中的变量访问的。在我的 Player 类中完成更新,因此我需要从我的 Player 类触发我的 GameViewController 类中的一个方法。

我已经尝试了一些东西。我得到的最深入的是使用“协议(protocol)”和“委托(delegate)”的这种方法。我有一个名为“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 类中。有帮助吗?

最佳答案

我将在这里做一些假设。

假设:

  • 这个游戏只有一个玩家,用单例表示
  • 未显示的内容负责调用 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++;
}
}

关于swift - 从另一个不相关的类改变 ViewController 中的 UILabels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34572797/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com