【发布时间】:2018-08-24 17:18:58
【问题描述】:
我让我的学生做一个基本的按钮点击“战斗”游戏,玩家可以按下按钮来攻击/防御/等等。我的学生需要跟踪玩家和敌人的健康状况,并更新标签上的屏幕随时更改。
我们几乎都以完全相同的方式处理这个... ctrl-单击一个按钮并将其拖到代码中,在弹出的弹出窗口中选择“action”,它创建一个函数,当玩家点击按钮。在该函数内部更改一些 HP 并更新与该 HP 关联的标签。像这样的...
@IBaction func playerAttacks {
enemyHP -= 30
enemyHPLabel.text = String(enemyHP)
}
10 个学生项目中有 9 个项目始终如一。有时,学生的项目根本无法正常工作。单击该按钮不会更新标签。但是,使用打印语句我可以看到它已经更新,如果我打印出enemyHPLabel.text,我会得到新的 HP。然而,它并没有在模拟器上更新。
如果他们再次点击,它会更新……但会更新为旧值。所以换句话说,第二次点击更新到第一次点击应该更新到的值,第三次点击更新到第二次应该更新到的值,等等。就像它总是落后一次点击?
在研究此问题时,我看到人们谈论网络代码并确保您更新“主”线程中的标签,但我不确定这是否适用于这里?我们没有使用任何花哨的代码,这真的是基本的东西。 无论哪种方式,它都对某些学生有效而对其他人无效,这非常令人困惑。
奇怪的信息,在学生将自己的图像放在按钮上之前我们遇到过几次,这将其更改为“自定义”类型。将其更改回“系统”类型已修复它。但是这个学生没有这样做,它已经在“系统”类型。
我们在 macOS High Sierra 10.13.2 上使用 XCode 9.2。所有这些在机器之间都是完全一致的。
有什么想法吗?
/EDIT 如果有人想看,请附上项目的链接:https://drive.google.com/file/d/1IXL6MsoQ4fv6VYRocFeyMmPOMGyu7kUp/view?usp=sharing
【问题讨论】:
-
这听起来像是一个并发问题。 “问题学生”是否有可能尝试从后台线程更新标签?
-
@Duncan C 老实说,甚至不完全确定这意味着什么,但他们以与其他学生相同的方式创建了这个函数,ctrl 单击并拖动并选择“动作”。它适用于大多数其他学生。
-
@DuncanC
@IBActions 在主线程上被调用。 -
如果有人想看,我附上了学生项目的链接。我不知道出了什么问题。