使用 prepareForReuse 函数从 UITableCell 类中的 ViewController 重置 var
Posted
技术标签:
【中文标题】使用 prepareForReuse 函数从 UITableCell 类中的 ViewController 重置 var【英文标题】:Reset var from ViewController inside the UITableCell class with prepareForReuse function 【发布时间】:2017-09-15 14:13:39 【问题描述】:我有一个包含一些单元格的 UITableView。这些单元格有数字,我将所有这些数字加起来,然后显示总数(grandTotal)。
override func viewWillAppear(_ animated: Bool)
grandTotal = 0.00
这是应用程序的简化版本,我使用 CoreData 来存储值。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
grandTotal! += grandTotal + 100
每次调用 cellForRowAt 时,grandTotal 未重置回 0.00 的问题。我有一个具有此功能的自定义 UITableViewCell。
override func prepareForReuse()
print("recalculate totals!!!!!!!")
UITableView加载后,所有数据正确显示,如果用户向上滑动,会触发cellForRowAt函数,然后重新计算grandTotal,不是从0.00开始,而是tableView加载后的总数。
我想在 perpareForReuse 函数中将 grandTotal var 设置回 0.00,但不知道如何再次从自定义单元类访问 grandTotal var。
grandTotal 变量是在我的 ViewController 类中创建的。
**** 编辑 ****
我有一个跟踪贷款的应用。因此,您创建了一个要添加到列表中的人。该人可以拥有多笔贷款。有些是你借的钱(正数),为什么有些是你借的钱(负数)。 TableView 显示您的应用程序中的所有人员。每个单元格还将每个人的所有贷款相加,并显示该人的正数或负数。然后,我要做的是将每个人的所有总数相加,并将其显示为总计。我得到了这个工作,但如果我在表格视图上向上或向下滑动,它会重新计算我的总数,而不是从 0 开始,它使用当前数字。
似乎有人建议我不应该在 cellForRowAt 函数中进行计算,我只是不确定我将如何去做,因为我正在使用单元格 indexPath 将人员数据拉出核心数据。
let person = fetchedResultsController.fetchedObjects![indexPath.row]
似乎我是否可以在每次调用 prepareForReuse 函数时将 grandTotal 设置回 0 的方法,这可能会起作用。我只是不确定如何在 ViewController 中访问该变量
我尝试过这样的事情:
let viewController:ViewController = ViewController(nibName: nil, bundle: nil)
print("\(String(describing: viewController.oweTotal)) owe total from perpare") --> nil
print("\(String(describing: viewController.owedTotal)) owed total from perpare") --> nil
但我认为我只是在创建一个新的 VC,而不是引用已经存在的那个。
【问题讨论】:
出于这个原因,您不应该在cellForRowAt
内进行计算。您应该将准备好的数据传递给表格视图,并根据您的数据源进行计算。
您的“总计”是否应该是当前在屏幕上可见的单元格的总数?正如 David 在他的评论中所说,您不应该在 cellForRowAt 中进行计算。表格视图可能会多次请求同一个单元格、请求无序的单元格等。如果您告诉我们您正在尝试做什么,我们可能会就如何完成它提供建议。
我将编辑问题以提供更多详细信息。
@Duncan C,这能帮助你理解我想要做什么吗?
【参考方案1】:
很难从示例代码中看出这里到底发生了什么。
当单元格出列“取消视图”时,它会被“回收”。当您向上滑动时,正在发生的情况是在 cellForRowAt... 函数中配置了回收的单元格。
从显示的代码中,对于本示例,您可以通过跟踪表格视图中最大的“IndexPath”来计算“总计”
max = max(max,indexPath.row)
max 是类 init 的 var,位于 0
【讨论】:
以上是关于使用 prepareForReuse 函数从 UITableCell 类中的 ViewController 重置 var的主要内容,如果未能解决你的问题,请参考以下文章
自定义 UITableViewCells 和正确使用 prepareForReuse 和 removeFromSuperview
UITableViewCell的prepareForReuse方法
如何停止使用渐变 UICollectionCell 创建新图层?覆盖 func prepareForReuse()