SwiftUI开发iOS数独游戏:前端显示与交互异常求助
排查方向与解决方案
1. 先检查Number类的实现逻辑
先确认你的Number类有没有踩值/引用类型的坑:
- 推荐用struct(值类型)替代class,避免引用共享导致的意外数据混乱:
struct Number { var value: Int? let isSystemGenerated: Bool // 系统生成标记设为let,防止被误修改 }
- 如果用的是class,要检查赋值、拷贝逻辑是否正确,有没有出现多个引用指向同一实例导致的状态异常。
2. 数独生成失败的排查
- 检查生成入口:有没有在
viewDidLoad()/viewDidAppear()里调用数独生成方法?没触发的话自然不会生成棋盘。 - 打印生成关键数据:在生成棋盘后打印有效数字数量,确认算法是否输出了正确的
Number数组:
let generatedBoard = generateSudokuBoard() print("生成的有效数字数:\(generatedBoard.flatMap { $0.value }.count)")
如果输出为0,说明生成算法本身有问题——比如挖空逻辑把所有数字都清空了,或者完整数独的生成逻辑没跑通。
- 检查数据源绑定:生成的
Number数组是否正确赋值给了CollectionView/TableView的数据源,有没有调用reloadData()刷新UI。
3. 用户输入失效的排查
- 检查控件交互状态:如果用UITextField做输入格子,要确保只有
isSystemGenerated == false的格子才开启isUserInteractionEnabled = true,系统生成的格子设为false。如果全关了交互,肯定无法输入。 - 检查输入代理逻辑:比如在
textField(_:shouldChangeCharactersIn:replacementString:)里,有没有正确判断当前格子是否允许输入:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard let indexPath = getIndexPath(for: textField), let number = board[indexPath.section][indexPath.row] else { return false } // 系统生成的格子禁止修改 if number.isSystemGenerated { return false } // 只允许输入1-9的数字 let allowedChars = CharacterSet(charactersIn: "123456789") return string.rangeOfCharacter(from: allowedChars) != nil }
- 检查输入后的数据源更新:输入完成后,要把输入值同步到对应的
Number实例中,比如在textFieldDidEndEditing里:
func textFieldDidEndEditing(_ textField: UITextField) { guard let indexPath = getIndexPath(for: textField), let text = textField.text, let value = Int(text) else { return } var number = board[indexPath.section][indexPath.row] number.value = value board[indexPath.section][indexPath.row] = number }
4. 粗体逻辑的关联排查
虽然你主要问题是生成和输入失效,但粗体配置错误也可能间接影响逻辑:
- 在cell配置时,要根据
isSystemGenerated正确设置字体和交互:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SudokuCell", for: indexPath) as! SudokuCell let number = board[indexPath.section][indexPath.row] cell.numberLabel.text = number.value.map(String.init) ?? "" // 系统生成数字设为粗体 cell.numberLabel.font = number.isSystemGenerated ? UIFont.boldSystemFont(ofSize: 17) : UIFont.systemFont(ofSize: 17) // 同步设置交互状态 cell.isUserInteractionEnabled = !number.isSystemGenerated return cell }
如果这里的board数据源传递错误,或者isSystemGenerated判断逻辑出错,不仅粗体不生效,还会导致交互状态异常。
内容的提问来源于stack exchange,提问作者Simone Samardhziev
相关产品推荐
相关产品推荐

