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

Swift/Xcode新手求助:TableView单元格数据无法实时更新

解决TableView单元格数据不更新的问题

嘿,刚看了你的问题,核心问题其实很明确:你每次API请求拿到新数据后,没有更新tableData数组并告诉TableView重新加载单元格。TableView只会在初始化或者你主动调用刷新方法时,才会去读取tableData里的最新内容并更新UI。

我给你拆解一下解决方案,一步步来:

1. 先修正初始化时的潜在崩溃风险

你在viewDidLoad里直接用了adaPercentGainString.htmlToAttributedString!强制解包,这时候API还没请求,这个值很可能是nil,直接崩溃都有可能。先给个默认值兜底:

override func viewDidLoad() {
    super.viewDidLoad()
    // 初始化时给一个默认的占位文本,避免nil崩溃
    let defaultAttributedText = NSAttributedString(string: "--")
    tableData = [
        MyData(imageRow: UIImage(named: "ada.png")!, firstRowLabel: "ADA/USDT", secondRowLabel: defaultAttributedText)
    ]
    // 这里可以再确认一下数据源和代理的设置(虽然你说已经设了)
    tableView.dataSource = self
    tableView.delegate = self
}

2. API请求完成后更新数据并刷新TableView

每次API拿到新的adaPercentGainString后,你需要做三件事:

  • 把HTML字符串转换成安全的NSAttributedString(别用强制解包)
  • 更新tableData数组里对应的元素
  • 通知TableView刷新对应的行(或全部行)

假设你的定时器和API请求代码是这样的,修改后应该是:

// 假设这是你按钮点击后启动定时器里的API请求方法
func startFetchingData() {
    Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in
        guard let self = self else { return }
        
        // 网络请求要放在后台线程,避免卡UI
        DispatchQueue.global().async {
            // 这里替换成你实际的API请求代码,拿到adaPercentGainString
            let newAdaPercentHtml = "你的API返回的HTML字符串"
            
            // 安全转换NSAttributedString
            guard let newAttributedText = newAdaPercentHtml.htmlToAttributedString else {
                print("HTML转换失败")
                return
            }
            
            // 更新UI必须切回主线程!
            DispatchQueue.main.async {
                // 更新tableData里的对应数据
                self.tableData[0].secondRowLabel = newAttributedText
                // 只刷新需要更新的行,比reloadData()更高效
                self.tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .automatic)
                // 如果以后有多个行,再改成reloadData()或者循环刷新对应行
                // self.tableView.reloadData()
            }
        }
    }
}

3. 几个关键注意事项

  • 永远别用强制解包!:网络返回的数据、HTML转换结果都可能是nil,用if let或guard let做安全检查,避免崩溃。
  • UI更新必须在主线程:网络请求默认是后台线程,更新tableData和刷新TableView一定要切回主线程,否则不会生效甚至崩溃。
  • 检查htmlToAttributedString方法:你说测试单元格能显示,但还是要确认这个扩展方法的正确性,比如可以在转换后打印一下newAttributedString.length,看是不是有内容。
  • 确认定时器和API请求正常运行:可以在API请求的回调里打印日志,看是不是每秒都在拿到新数据,避免定时器没启动或者API请求失败的情况。

按这个思路修改后,每次API请求拿到新数据,TableView的单元格就会自动更新显示最新的涨幅百分比了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:31:44