访问现有的 UITableViewCell

Posted

技术标签:

【中文标题】访问现有的 UITableViewCell【英文标题】:Accessing existing UITableViewCell 【发布时间】:2011-02-24 22:56:19 【问题描述】:

这是一个不同的问题,但我认为错误并没有错,所以我调整了标题以反映我真正想到的内容。

我正在制作一个动画,该动画在普通 UITableViewCell 的 cell.imageView 中获取图像副本并将其移动到屏幕底部的标签栏,以模拟将商品放入购物车。我可以复制图像并将副本放置为窗口的子视图,但我不知道如何获取原始图像的绝对位置,因此我可以将其放在顶部作为动画的起点。

图像始终显示在屏幕顶部,就像放置在 0,0 处一样。

对不起,这个问题的性质很愚蠢,我确定我遗漏了一些非常明显的东西。

-(void)tableView:(UITableView *)tableView 附件ButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath

UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
UIImageView *originalImgView = cell.imageView;
UIImageView *img = [[[UIImageView alloc] initWithImage: cell.imageView.image] autorelease];

NSLog(@"Original %@", originalImgView.bounds);  // Shows "Original (null)" at runtime.
NSLog(@"Window Points %@", [self.view.window convertPoint:originalImgView.frame.origin toView:nil]);
NSLog(@"Cell Points: %@", cell.bounds);  // Shows "Original (null)" at runtime.

[img setFrame:CGRectMake( originalImgView.bounds.origin.x, originalImgView.bounds.origin.y ,
        cell.imageView.image.size.width, cell.imageView.image.size.height)];

[self.view.window addSubview:img];

NSLog(@"Selected Cell: %@", cell); // Shows cell info at run time, works

【问题讨论】:

我想我知道怎么了。当我调用 [self tableView:tableView cellForRotAtIndexPath ....] 时。我没有得到对现有单元格的引用。我正在从头开始获取单元格的新“副本”。因此,当我尝试获取有关单元格位置的信息时,实际上是在获取未正确布局的单元格副本的位置。 【参考方案1】:

所以我做错了。 我正在制作一个具有相同内容的新单元格,而不是使用当前单元格。我通过在创建单元格时向单元格添加标签来解决此问题。

cell.tag = [indexPath 行];

除了当 [indexPath row] == 0 时给我带来了问题。所以我添加了 1000,问题就消失了。

cell.tag = (1000 +[indexPath row]);

然后我只是替换了这一行

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

UITableViewCell *cell = (UITableViewCell *)[self.tableView viewWithTag:(1000 + [indexPath row])];

现在我得到了对表格视图中实际单元格的引用,并且得到了正确的帧值。

【讨论】:

【参考方案2】:

如果有超过 1 个部分,这可能会提供更多独特的标签

([indexPath section]+1) 避免乘以第 0 部分 (1000 * ([indexPath section]+1)) 给出 1000、2000 等的步长。

在 cellForRowAtIndexPath 中设置标签... cell.tag = ((1000 * ([indexPath section]+1)) +[indexPath row]);

在 didSelectRowAtIndexPath 中检索它... UITableViewCell *selectedCell = (UITableViewCell *) [playlistTableView viewWithTag:((1000 * ([indexPath section]+1)) + [indexPath row])];

假设您的列表在每个部分中不超过 1000 个单元格。

这是一个很好的问题,Donk 的回答非常有用,非常感谢您发布详细信息。

【讨论】:

我喜欢 Donk 使用视图标签的想法。当然,这仅适用于可见细胞,因为它们是可回收的。但这在响应 UI 事件时很好!快速搜索 mapping two integers onto a unique value 会出现 Szudzik 的函数a >= b ? a * a + a + b : a + b * b; where a, b >= 0。弹出您的部分和行以获得您单元格的唯一视图 ID。

以上是关于访问现有的 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongoose 访问现有的 mongodb 集合

使用 mongoose 访问现有的 mongodb 集合

使用反应渲染时如何访问现有的 dom 元素?

使用 VBA 将 csv 文件导入现有的访问表

访问现有的 WPF 应用程序实例?

从onClickListerner访问现有的json对象