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

Swift发票App:InvoiceViewController单元格值传递至下页异常求助

Swift 发票APP单元格传值范围错误&显示异常排查方案

常见问题排查与解决

1. 数组越界(Range Error)的核心原因

范围错误基本是获取单元格数据时,索引超出了数据源数组的边界。比如:

  • 在cellForRowAt里用了错误索引,或是跳转时取了错误的数组下标
  • 数据源数组在跳转前被意外修改(比如元素被删除但索引没同步更新)

正确写法示例:
跳转时一定要先做边界检查,用indexPath.row匹配数据源:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toDetailVC" {
        guard let indexPath = tableView.indexPathForSelectedRow,
              let detailVC = segue.destination as? DetailViewController,
              indexPath.row < invoices.count else {
            return // 边界检查,直接避免越界崩溃
        }
        let selectedInvoice = invoices[indexPath.row]
        detailVC.invoice = selectedInvoice
    }
}

2. 单元格/详情页显示异常的关联排查

传值后显示异常,要同步检查这几点:

  • 详情页的UI控件IBOutlet是否正确关联,有没有出现nil的情况
  • 传递的Invoice模型对象是否正确初始化,属性有没有赋值错误
  • 详情页是否在viewDidLoad或viewWillAppear里正确用传递的数据刷新UI

详情页刷新示例:

var invoice: Invoice?

override func viewDidLoad() {
    super.viewDidLoad()
    guard let invoice = invoice else { return }
    // 给对应UI控件赋值
    amountLabel.text = String(format: "$%.2f", invoice.amount)
    dateLabel.text = invoice.formattedDate
}

3. 其他容易踩的坑

  • 如果用了自定义单元格,检查prepareForReuse方法有没有重置控件内容,避免复用时数据残留
  • 数据源数组如果是可变类型,要避免多线程修改(比如后台更新数据后,必须回到主线程刷新tableView)

如果以上方案没解决问题,建议补充贴出以下代码:

  • InvoiceViewController中tableView(_:cellForRowAt:)的完整实现
  • prepare(for:sender:)的全部代码
  • 详情ViewController接收数据和刷新UI的代码

这样能更精准定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:50:06