我们找不到一种方法来将UITableCell中的UIViews设置为来自回调的动作。
假设您在单击UITableViewCell上的按钮的情况下触发了下载图片的异步操作。进一步假设当下载图片时,我们希望单元格中的UIView为图片设置动画,以便为用户提供即将呈现新内容的视觉反馈。
我们无法找到一种方法来跟踪UIVIew以调用beginAnimation,因为用户单击的原始单元格现在可能会用于另一行,因为当您向上和向下滚动时,单元格的性质会被重复使用桌子。换句话说,我们不能保持指向UITableViewCell的指针。我们需要找到另一种定位单元格的方法,并在该行可见时为其设置动画,如果该行滚动超出范围,则不进行动画处理。
答案 0 :(得分:1)
保持单元格对象与正在设置动画的对象不同,以便单元格保存UIView。当发生动画回调时,检查以确保UIView仍然存在,如果存在,则为更改设置动画。
当单元格对象从屏幕上被撞出并被回收时,释放已经动画化的UIView并创建一个新的UIView。当动画回调发生时,它将无事可做,因为UIView不再存在。
上面的修改是在UIView中保留某种对象,你的回调可以检查动画是否仍然合适。这可能是正在下载的图片的某种唯一标识符。如果标识符发生更改,则不需要动画。如果匹配,请执行动画。
编辑:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *MyIdentifier = @"MyTableCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:MyIdentifier] autorelease];
} else {
UIView *oldViewToAnimate = [cell.contentView viewWithTag:1];
[oldViewToAnimate removeFromSuperview];
}
UIView *viewToAnimate = [[UIView alloc] initWithFrame:CGRectZero]; //replace with appropriate frame
viewToAnimate.tag = 1;
[cell.contentView addSubview:viewToAnimate];
return cell;
}
当您产生下载过程时,您会传递[cell.contentView viewWithTag:1]
。下载完成后,它将更新相应的视图。如果重用表格单元格,则视图将不再具有超级视图,并且不会更新错误的单元格。
您可以采取一些措施来提高效率,但这是基本想法。如果你有一个自定义的UITableViewCell,那么可能会有点不同。
编辑2:
要重复使用viewToAnimate对象以确保在父单元格被回收时它们会更新,请执行以下操作:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *MyIdentifier = @"MyTableCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:MyIdentifier] autorelease];
} else {
UIView *oldViewToAnimate = [cell.contentView viewWithTag:1];
[oldViewToAnimate removeFromSuperview];
}
UIView *viewToAnimate = [self viewToAnimateForIndexPath:indexPath];
viewToAnimate.tag = 1;
[cell.contentView addSubview:viewToAnimate];
return cell;
}
viewToAnimateForIndexPath
需要:
我对您的数据结构知之甚少。下载过程完成后,可以调用相同的方法来获取视图并为其设置动画。