iOS Swift:点击按钮如何刷新TableView数据?含模型及单元格代码
点击按钮刷新TableView数据的实现方案(Swift iOS)
嘿,结合你给出的模型、数组和单元格代码,我来帮你梳理清楚点击按钮刷新TableView的完整流程:
核心逻辑
本质上就是:先更新数据源数组data1里的模型数据,再调用TableView的刷新方法让界面同步。下面分步骤拆解:
1. 给按钮绑定点击事件
首先确保你的按钮已经关联了IBAction——可以在Storyboard里把按钮拖拽到ViewController代码里生成,或者用代码创建按钮时添加点击事件:
@IBAction func refreshBtnTapped(_ sender: UIButton) { // 这里写刷新的核心逻辑 }
2. 更新数据源(最关键的一步)
在按钮点击方法里,根据你的需求修改data1数组里的模型。举几个常见场景:
场景1:修改已有行的数据
比如修改第0行的数量、单价,同时自动计算总价:
@IBAction func refreshBtnTapped(_ sender: UIButton) { // 先判断数组非空,避免越界崩溃 guard !data1.isEmpty else { return } let targetModel = data1[0] targetModel.number = 5.0 // 更新数量 targetModel.price = 20.0 // 更新单价 targetModel.sum = targetModel.number * targetModel.price // 重新计算总价 // 刷新整个表格(如果只改一行,用下面的方法更高效) tableView.reloadData() // 只刷新修改的那一行(推荐,性能更好) // let indexPath = IndexPath(row: 0, section: 0) // tableView.reloadRows(at: [indexPath], with: .fade) }
场景2:新增一条数据到数组
@IBAction func refreshBtnTapped(_ sender: UIButton) { let newModel = data() newModel.name = "新增商品" newModel.number = 3.0 newModel.price = 15.0 newModel.sum = newModel.number * newModel.price data1.append(newModel) // 插入新行并带动画效果 let newIndex = IndexPath(row: data1.count - 1, section: 0) tableView.insertRows(at: [newIndex], with: .automatic) // 如果不需要动画,直接调用tableView.reloadData()也可以 }
3. 优化你的单元格代码(避免崩溃)
你当前的didSet里用了a11!强制解包,很容易因为nil导致崩溃,建议改成安全的可选绑定:
var data1 : data? { didSet { // 直接赋值name,nil时text会是空 a0.text = data1?.name // 处理数字转字符串,安全避免nil if let num = data1?.number { a1.text = String(num) } if let price = data1?.price { a2.text = String(price) } // 安全计算总价 if let num = data1?.number, let price = data1?.price { let total = num * price a3.text = String(total) // 同时把计算好的总价存回模型(如果需要后续使用的话) data1?.sum = total } else { a3.text = "0" } } }
4. 确认TableView的数据源/代理已正确设置
别忘了你的ViewController要遵守UITableViewDataSource协议,并且给TableView设置数据源:
// 假设你的ViewController叫MainVC extension MainVC: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return data1.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // 注意替换成你的单元格标识符和类名 let cell = tableView.dequeueReusableCell(withIdentifier: "GoodsCell", for: indexPath) as! GoodsTableViewCell cell.data1 = data1[indexPath.row] return cell } }
同时要确保在ViewController的viewDidLoad里设置:
override func viewDidLoad() { super.viewDidLoad() tableView.dataSource = self // 如果需要代理方法(比如点击行),还要设置tableView.delegate = self }
几个小提醒
- 永远先改数据源,再刷新TableView,顺序不能反;
- 尽量避免用
tableView.reloadData()刷新整个表格,针对修改的行用reloadRows或insertRows更高效; - Swift命名规范里,类名首字母要大写,建议把
data改成GoodsModel或者DataModel,可读性更好; - 处理可选值时,多用
guard let或if let,少用强制解包!。
内容的提问来源于stack exchange,提问作者haotian z
相关产品推荐
相关产品推荐

