目前,我已经设置了一个设置,在这个设置中,当一个网络进程正在进行时,点击一个单元格会在单元上显示一个活动指示符。完成后,该单元格将自动更新其UI。
问题是,当这种情况发生时,如果用户将单元格从屏幕上滚动出去,它将被重用,并且当您回滚单元格时,该单元格要么位于预点击的UI中,要么位于后点击的UI中(取决于用户滚动时是否完成了进程)。
这让人觉得正在执行的后台操作只是随机地停在用户透视图上,但它仍然在发生,只是UI会被刷新。
因此,我很难知道如何暂时防止单元格的重用,或者有其他方法,即使在重用之后,我也可以在单元格上维护一致的加载指示符吗?
编辑:用一些数据来保存indexPath的想法是朝着正确的方向迈出的一步,但排序是可能的,但不能保证保持不变。
所以,我想问题就变成了:当我得到进程已经完成的委托调用时,我需要找到一些独特的东西来标识给定的单元格。我试图使用标签的文本,因为它是“唯一的”(99%的时间.)但这只能保证工作,除非我也传递“唯一”标识符(标签,它甚至不保证是唯一的)在我的支持类的乐趣过山车,只是为了它可以使用在最后。
我试过的东西
1) 尝试:在加载时将单元格放置在NSMutableArray属性中,并在完成时使用委托方法删除该单元格,即:
[self.loadingCells addObject:cell];结果:无影响
2) 尝试:向UITableViewCell (I子类)添加一个名为isLoading的属性。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
if (cell.isLoading) {
[cell.activityView startAnimating];
}
}结果:加载指示剂在正确的细胞上,但也有其他当离屏时。
工作正常,但我遇到了其他随机细胞的问题,现在看起来它们神秘地看起来像是在加载,因为原来的细胞被重复使用来制造它们。
3) 尝试:与尝试#1相同的,除非使用(唯一)单元格的标签文本:
[self.loadingCells addObject:cell.label.text];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
if ([self.loadingCells containsObject:cell.label.text]) {
[cell.activityView startAnimating];
}
}
// delegate method
- (void)finishedLoading:(MyCell *)cell {
[cell.activityView stopAnimating];
[self.loadingCells removeObject:cell.label.text];
}结果:只在正确的单元格上加载指示符,但是委托方法尝试删除错误的标签文本,如果进程结束时单元格不在屏幕上,则导致单元格看起来像永久加载。
4)然后,我继续在委托方法上传递一个,并尝试比较它们并删除正确的字符串.这也给出了不可靠的结果。我推测这是因为传递给处理网络调用的类的单元可能不会保持静态,如果我在调用提取标签的文本时没有显示单元格,那么它将是不正确的。
所以我可以马上制作NSString,并通过我在不同类中所做的精彩调用网络来传递它,但是这太荒谬了,我已经不喜欢这个解决方案了。
发布于 2015-11-13 03:33:52
您不应该将这种类型的数据存储在单元格上,我保证您肯定不想阻止这些单元格被重用。这是UITableView背后最强大的特性之一,也是促使它快速发展的原因之一。
处理这一问题的最佳方法是拥有一个数组或其他类型的数据存储,它保存用于“配置”单元格的所有数据。本质上,有一个数组,您可以检查是cellForItemAtIndexPath,以确定单元格是否需要指示符。然后根据该数据相应地配置单元。这样你就不需要把状态保存在细胞里了。
很难精确地布局这是如何完成的,但这里有一个非常人为的例子,说明如何检查一个单元格是否已经使用地图加载了。如果该单元格不在映射中,则可以使用默认值添加该单元格,并一如既往地进行处理。
//: Playground - noun: a place where people can play
import UIKit
let index1 = NSIndexPath(forRow: 0, inSection: 0)
let index2 = NSIndexPath(forRow: 1, inSection: 0)
let index3 = NSIndexPath(forRow: 2, inSection: 0)
let index4 = NSIndexPath(forRow: 3, inSection: 0)
var cellIsLoadingMap = [NSIndexPath: Bool]()
cellIsLoadingMap[index1] = true
cellIsLoadingMap[index2] = true
cellIsLoadingMap[index3] = false
cellIsLoadingMap[index4] = false
let index5 = NSIndexPath(forRow: 4, inSection: 0)
if let isLoading = cellIsLoadingMap[index5] {
print(isLoading)
} else {
cellIsLoadingMap[index5] = false
}https://stackoverflow.com/questions/33685454
复制相似问题