首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何暂时停止某些UITableViewCell的重用?(或唯一标识单元格,即使该单元格被重用)

如何暂时停止某些UITableViewCell的重用?(或唯一标识单元格,即使该单元格被重用)
EN

Stack Overflow用户
提问于 2015-11-13 03:27:29
回答 1查看 61关注 0票数 2

目前,我已经设置了一个设置,在这个设置中,当一个网络进程正在进行时,点击一个单元格会在单元上显示一个活动指示符。完成后,该单元格将自动更新其UI。

问题是,当这种情况发生时,如果用户将单元格从屏幕上滚动出去,它将被重用,并且当您回滚单元格时,该单元格要么位于预点击的UI中,要么位于后点击的UI中(取决于用户滚动时是否完成了进程)。

这让人觉得正在执行的后台操作只是随机地停在用户透视图上,但它仍然在发生,只是UI会被刷新。

因此,我很难知道如何暂时防止单元格的重用,或者有其他方法,即使在重用之后,我也可以在单元格上维护一致的加载指示符吗?

编辑:用一些数据来保存indexPath的想法是朝着正确的方向迈出的一步,但排序是可能的,但不能保证保持不变。

所以,我想问题就变成了:当我得到进程已经完成的委托调用时,我需要找到一些独特的东西来标识给定的单元格。我试图使用标签的文本,因为它是“唯一的”(99%的时间.)但这只能保证工作,除非我也传递“唯一”标识符(标签,它甚至不保证是唯一的)在我的支持类的乐趣过山车,只是为了它可以使用在最后。

我试过的东西

1) 尝试:在加载时将单元格放置在NSMutableArray属性中,并在完成时使用委托方法删除该单元格,即:

代码语言:javascript
复制
[self.loadingCells addObject:cell];

结果:无影响

2) 尝试:向UITableViewCell (I子类)添加一个名为isLoading的属性。

代码语言:javascript
复制
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    if (cell.isLoading) {
        [cell.activityView startAnimating];
    }
}

结果:加载指示剂在正确的细胞上,但也有其他当离屏时。

工作正常,但我遇到了其他随机细胞的问题,现在看起来它们神秘地看起来像是在加载,因为原来的细胞被重复使用来制造它们。

3) 尝试:与尝试#1相同的,除非使用(唯一)单元格的标签文本:

[self.loadingCells addObject:cell.label.text];

代码语言:javascript
复制
- (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,并通过我在不同类中所做的精彩调用网络来传递它,但是这太荒谬了,我已经不喜欢这个解决方案了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-13 03:33:52

您不应该将这种类型的数据存储在单元格上,我保证您肯定不想阻止这些单元格被重用。这是UITableView背后最强大的特性之一,也是促使它快速发展的原因之一。

处理这一问题的最佳方法是拥有一个数组或其他类型的数据存储,它保存用于“配置”单元格的所有数据。本质上,有一个数组,您可以检查是cellForItemAtIndexPath,以确定单元格是否需要指示符。然后根据该数据相应地配置单元。这样你就不需要把状态保存在细胞里了。

很难精确地布局这是如何完成的,但这里有一个非常人为的例子,说明如何检查一个单元格是否已经使用地图加载了。如果该单元格不在映射中,则可以使用默认值添加该单元格,并一如既往地进行处理。

代码语言:javascript
复制
//: 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
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33685454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档