如何在UITableView中存储UIActivityIndi​​cator状态?

时间:2013-06-12 13:23:21

标签: objective-c uitableview show-hide uiactivityindicatorview state-management

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

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

问题:我的问题是,考虑用户点击3个单元格的情况。因此,三个单元格将显示活动指示符来表示其下载过程。如果用户滚动表格视图并返回相同的单元格,则隐藏活动指示符。这是因为,tableview的单元格创建方法仅针对可见单元格调用。那么,我如何存储每个细胞活动指标的状态呢?

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

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

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