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
相关产品推荐
相关产品推荐

