2

我正在尝试向 UITableView 中的某些单元格添加活动指示器。我在方法 didSelectRowAtIndexpath 使用成功地做到了这一点

    CGRect CellFrame = CGRectMake(260, 10, 20, 20);
    actindicator = [[UIActivityIndicatorView alloc]initWithFrame:CellFrame];
    [actindicator setHidesWhenStopped:NO];
    [actindicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleGray];
    actindicator.tag =1;
    [[cell contentView] addSubview:actindicator];

问题是我需要通过另一种方法控制这些多个活动指标。我认为一个属性是一种方法来做到这一点,但是通过每次初始化一个新的actIndicator实例,我失去了对活动指示器的“最新”初始化之外的所有引用,因此这意味着我只能控制一个。

我需要在这里做什么(如果可能的话?)以保持对所有 actIndicators 的引用,以便我可以开始为所有这些设置动画?或者我能否以某种方式使用 actindicator.tag 来控制某种形式的参考。

非常感谢您的帮助。

编辑:(源自答案)访问 tableView 中标记为 1 的所有 Activity 指示器实例(仅可见单元格)可以从另一种方法使用下面的:

for (UITableViewCell *cell in [self.tableView visibleCells]) {
    UIActivityIndicatorView *actView = (UIActivityIndicatorView *)[cell.contentView
    viewWithTag:1];
    [actView startAnimating];
    activityFlag = 1;

}

上述方法将循环遍历所有可见单元格并开始为活动指示器设置动画。

为了处理 tableview 被滚动的情况,我使用 cellForRowAtIndexPath 中的下面的方法重新为指标设置动画。cellStateKey 仅指示单元格旁边是否有复选标记,如果它确实有复选标记并且我的活动标志(正在进行的异步网络服务器调用)已设置..然后我想继续动画。(技术上重新启动动画,作为滚动表视图停止它)

if ([[rowData objectForKey:cellStateKey] boolValue]) {

    cell.accessoryType = UITableViewCellAccessoryCheckmark;

      if(cell.accessoryType == UITableViewCellAccessoryCheckmark &&activityFlag ==1){

        for (UIView *sub in [[cell contentView] subviews]) {

            if (sub.tag == 1) {

                UIActivityIndicatorView *acView = (UIActivityIndicatorView *)
                [cell.contentView viewWithTag:1];
                [acView startAnimating];


            }

        }

如原始问题中所述,我在方法 didSelectRowAtIndexPath 中初始化我的活动指标(并在需要时删除活动指标)

4

4 回答 4

8

您可以将 UIActivityIndi​​catorView 添加为单元格的附件视图。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    spinner.frame = CGRectMake(0, 0, 24, 24);
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryView = spinner;
    [spinner startAnimating];
    [spinner release];
}
于 2013-05-07T14:37:40.873 回答
3

执行此操作的一种简单方法(假设您在代码中添加指示器)是首先通过调用获取表中可见单元格(或行)的集合[tableView visibleCells]。然后像这样遍历单元格:

for (UITableViewCell *cell in [tableView visibleCells]) {
    for (UIView *sub in [cell subViews]) {
        if (sub.tag == 1) { // "1" is not a good choice for a tag here
            UIActivityIndicatorView *act = (UIActivityIndicatorView *)sub;
            [act startAnimating]; // or whatever the command to start animating is
            break;
        }
    }
}

您需要处理更多复杂性:在您的原始代码中,您需要确保每次cellForRowAtIndexPath调用时都不会向预先存在的单元格添加额外的活动指示器,并且您需要考虑用户的情况稍后可能会滚动表格,从而暴露未打开活动指示器的单元格。

于 2013-05-07T14:40:50.690 回答
2

您需要通过扩展它来制作自定义 UITableViewCell。然后将 UIActivityIndi​​catorView 作为该 Cell 的成员。然后,您可以逐个单元地访问和控制它。

于 2013-05-07T14:33:30.800 回答
1

假设活动视图指示器标签在 cell.contentView 中是唯一的,您可以尝试以下操作:

UITableViewCell *cell = [tableview cellForRowAtIndexPath:indexpath];

UIActivityIndicatorView *acView = (UIActivityIndicatorView *)[cell.contentView viewWithTag:1];

//acView will be your activitivyIndicator
于 2013-05-08T04:39:42.383 回答