活动指示器仅显示在一个单元格中

时间:2012-07-07 19:31:16

标签: objective-c ios cocoa

我有一个UITableView,其中包含显示文件名的单元格,单元格还指示文件的上传/下载进度。移动文件时,其相应的单元格应在其附件视图中显示UIActivityIndicatorView。我设置了UIActivityIndicatorView并准备进入viewDidLoad但是当我尝试将其设置为多个单元格的附件视图时,它只显示在一个 cell

-(void)viewDidLoad {

    [super viewDidLoad];

    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [activityIndicator startAnimating];

}


//...code that detects file changes and calls fileChange


-(void)fileChange {

    for (int i = 0; i < [self.cloudNames count]; i++) {

        //detect whether file name in array is uploading, downloading, or doing nothing

        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

        if (downloading) {

            cell.accessoryView = activityIndicator;
            //other changes here specific to downloads

        } else if (uploading) {

            cell.accessoryView = activityIndicator;
            //other changes here specific to uploads

        } else {

            cell.accessoryView = nil;

        }

    }

}

正如我所说,活动指示器仅显示在一个单元格中,即使有多个单元格应该显示它

我不想在UIActivityIndicatorView方法中设置fileChange(即使它有效),因为在上传/下载过程中会多次调用此方法。如果调用该方法并在那里设置活动指示器,则在调用该方法时,活动指示器将在所有表视图单元格中重置,从而导致出现毛刺和不平滑的动画,并且会导致巨大的内存问题。

有什么想法怎么办?感谢。

1 个答案:

答案 0 :(得分:3)

即使您要为单元格设置活动指示器,也只有一个实例变量。这样做的方法是为tableView:cellForRowAtIndexPath:

中的每个单元格创建一个指标

您可以为UIActivityIndicatorView设置标记,无论何时您想要访问它或抓住它,您都可以获取该单元格,并使用[cellView viewWithTag:theTag]获取指标视图。不需要实例变量。

如果你想让事情变得更加漂亮,你可以继承UITableViewCell并在自定义单元格内做任何你想做的事情。

修改

要获取视图,您可以分配到附件视图,只需获取单元accessoryView:

 UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

 UIActivityIndicatorView *indicator = (UIActivityIndicatorView *) cell.accessoryView;

或者你可以将UIActivityIndi​​catorView添加到单元格的contentView中(这样你就可以把它放在任何你想要的地方,你有更多的灵活性):

添加指标:

myIndicatorView.tag = 1;
[cell.contentView addSubview:myIndicatorView];

得到指标:

UIActivityIndicatorView *indicator = [cell.contentView viewWithTag:1];

希望这会有所帮助