0

我有一个UITableView显示文件名的。当用户点击单元格时,我会下载点击的文件。为此,我在选定单元格的左侧显示了一个活动指示器。下载结束后,活动指示器将隐藏。(请记住,单元格中的其他内容不会改变)。

这里没有规则一次只单击一个单元格。用户可以点击任意数量的单元格来启动下载过程。我只是开始下载过程并将其添加到操作队列中。

问题:我的问题是,考虑用户点击 3 个单元格的场景。因此,三个单元格将显示活动指示器来表示它们的下载过程。如果用户滚动表格视图并返回到相同的单元格,则活动指示器被隐藏。这是因为,tableview 的单元格创建方法只会为可见单元格调用。那么,如何存储每个单元格活动指示器的状态?

4

2 回答 2

1

您可以存储正在下载的文件。并为每一行创建活动指示器。像这样的东西:

NSArray* filesArr;

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* identifier = @"identifier";
    YoursTableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if(!cell){
        cell = [[YoursTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }
    //.....
    if(filesArr[indexPath.row].downloading)
        [cell.activity startAnimating];
    else
        [cell.activity stopAnimating];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(filesArr[indexPath.row].downloading)
         return;
    [self startDownload:filesArr[indexPath.row]];
    filesArr[indexPath.row].downloading = YES;
    [tableView reloadData];
}
于 2013-06-12T13:46:00.537 回答
0

正如您在问题中提到的那样,这个问题部分是细胞重用的产物。当一个单元出列时,您必须更新其在单元上的活动状态,方法是在文件对象上创建一个属性以按照 Sk0prion 的建议下载状态,或者通过一些并行结构。

我只想提一个替代方案。如果您只有几个单元格,您可以想象绕过单元格重用并将单元格存储在字典中。通过避免单元重用,状态本质上由单元而不是它引用的对象来承担。内存压力显然是个问题。我很少发现这是首选解决方案的情况。

于 2013-06-12T21:02:32.350 回答