UITableViewCell,两个单元格都获得了附件视图

Posted

技术标签:

【中文标题】UITableViewCell,两个单元格都获得了附件视图【英文标题】:UITableViewCell, two cells are both getting an accessory view 【发布时间】:2011-09-12 16:14:25 【问题描述】:

情况:当用户选择一个单元格时,会向该单元格添加一个按钮。当他们选择一个新单元格时,该按钮将从前一个单元格中删除并添加到新单元格中。这样可行。问题是当更多数据添加到表中时。所以假设有 20 个单元格,然后我添加另外 20 个单元格。然后我选择第一个单元格,但是按钮被添加到单元格 1 和单元格 21。尽管选择委托方法只注册第一个被选中的单元格。

来自我的 didSelectRowAtIndexPath 方法:

if (self.selectedCell) 
    self.selectedCell.accessoryView = nil;
    self.selectedCell = nil;


UIButton *downloadButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[downloadButton setTitle:@"Download" forState:UIControlStateNormal];
[downloadButton setFrame:CGRectMake(0, 0, 130, 34)];

self.selectedCell = [self.tableView cellForRowAtIndexPath:indexPath];

self.selectedCell.accessoryView = downloadButton;
[self.selectedCell setNeedsDisplay];

在我将更多数据添加到我以结束的表中的方法中:

if(self.selectedCell)
    self.selectedCell.accessoryView = nil;
    self.selectedCell = nil;


[self.tableView reloadData];
[self.tableView setNeedsLayout];

【问题讨论】:

【参考方案1】:

细胞被重复使用。在您的cellForRowAtIndexPath: 中,您忘记清除accessoryView。当单元格被重用时,accessoryView 就会出现。

我喜欢的一个技巧是在tableView:willDisplayCell:forRowAtIndexPath: 中设置accessoryView。这是在单元格放在屏幕上之前调用的。然后,您可以执行以下操作:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
  if (cell.isSelected) 
    cell.accessoryView = self.downloadButton; // No reason to create a new one every time, right?
  
  else 
    cell.accessoryView = nil;
  

【讨论】:

我在我的一个项目中遇到了同样的问题。您还可以在单​​元格创建之外设置附件视图(避免将单元格与附件视图重用)。 嘿 bill burgess.. 我也被这个问题困扰.. 你能告诉我如何在单元格创建之外设置附件视图吗? 你重复使用同一个cell.accessoryView = self.downloadbutton 实例真的有效吗?似乎导致 UI 死锁:***.com/questions/3190675/…

以上是关于UITableViewCell,两个单元格都获得了附件视图的主要内容,如果未能解决你的问题,请参考以下文章

从多个注释中获取距离

Swift中带有按钮的UITableViewCell [重复]

XCode5 中 UITableviewCell 的弹出视图

我的 UITableViewCell 正在重用以前的单元格 UIImage

特定 UITableViewCell 的不同元素

点击单元格后不同的 UITableViewCell 子视图布局