You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何获取UIButton当前标题?强制解包遇nil崩溃如何解决

问题原因

你的报错核心是强制解包了可空类型的nil值:sender.title(for: .normal) 是可空String类型,当按钮没有设置normal状态的普通标题时,这个值就会返回nil,你用!强制要求它一定有值,运行时就会触发崩溃。

修复方案

1. 替换强制解包为安全解包(必改)

把letterButtonPressed方法里的强制解包逻辑替换为安全校验,哪怕按钮没设置标题也不会崩溃:

@IBAction func letterButtonPressed(_ sender: UIButton) {
    sender.isEnabled = false
    // 安全校验:如果拿不到标题直接返回,不执行后续逻辑
    guard let letterString = sender.title(for: .normal), !letterString.isEmpty else {
        print("调试提示:当前按钮未设置normal状态标题")
        return
    }
    let letter = Character(letterString.lowercased())
    currentGame.playerGuessed(letter: letter)
    updateUI()
}

2. 检查Storyboard/XIB配置

打开你的界面文件,检查letterButtons集合绑定的所有按钮:

  • 确认每个按钮的 State Config 选到Default 时,Title栏有输入对应的字母内容
  • 确认没有只设置了Attributed Title,没设置普通Plain Title的按钮

3. 其他附带问题修复(避免后续报错)

你现有代码还有几个隐藏问题,建议一起修改:

  • 胜负计数totalWins、totalLosses现在是let常量,后续无法修改数值,改成var:
var totalWins = 0
var totalLosses = 0
  • newRound方法里要重置所有按钮的可用状态,不然第二轮开始所有按钮都是禁用的:
func newRound() {
    let newWord = listOfWords.removeFirst()
    currentGame = Game(word: newWord, incorrectMovesRemaining: incorrectMovesAllowed, guessedLetters: [])
    // 重置所有字母按钮为可用状态
    letterButtons.forEach { $0.isEnabled = true }
    updateUI()
}
  • 补充correctWordLabel的显示逻辑,在updateUI里添加当前已猜字母的拼接展示,不然单词显示区域一直是空的。

内容的提问来源于stack exchange,提问作者Richard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:15:10