使用 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的主要内容,如果未能解决你的问题,请参考以下文章

如何实现`prepareForReuse`?

自定义 UITableViewCells 和正确使用 prepareForReuse 和 removeFromSuperview

UITableViewCell的prepareForReuse方法

如何停止使用渐变 UICollectionCell 创建新图层?覆盖 func prepareForReuse()

tableView/collectionView复用prepareForReuse

iOS 怎么避免tableview刷新数据错乱