在 UITableViewCell 中使用备用附件类型
Posted
技术标签:
【中文标题】在 UITableViewCell 中使用备用附件类型【英文标题】:Using alternate accessoryType in UITableViewCell 【发布时间】:2010-08-29 08:40:36 【问题描述】:我基本上想根据某些情况显示一个 UITableViewCellAccessoryDisclosureIndicator,在这种情况下,我的行数据中存在一个 URL(我通过 indexPath.row 引用它。
我有正确的代码来解决这个问题(即,如果 URL 存在),但我不确定我应该在“cellForRowAtIndexPath:”方法中的何处声明此代码。我在 if(cell == nil) 子句内部和外部都试过了,当单元格从滚动返回到视图中时,有时会在有或没有指示符的情况下重绘单元格。
它在初始绘制时工作正常。
关于如何最好地实现这一点的任何提示?
【问题讨论】:
【参考方案1】:是的,您应该将它放在“if (cell == nil)”语句之外的 cellForRowAtIndexPath: 委托方法中。由于细胞被回收利用,您必须确保每个细胞的附件类型都设置为正确的值,而不仅仅是需要特定附件类型的那些。
例如:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)ip
UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@"CELL"];
if (cell == nil)
cell = [[[UITableView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"] autorelease];
if (ip.row == 3)
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
此代码无法按我们希望的方式运行。由于单元格被回收,附件类型设置为 UITableViewCellAccessoryDisclosureIndicator 的单元格稍后将在未定义的行中重复使用,然后会显示一个披露指示符,即使它不在第 3 行。
为了处理单元格重用,我们必须为每个单元格设置附件类型,无论它们的行是什么:
if (ip.row == 3)
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
else
cell.accessoryType = UiTableViewCellAccessoryNone;
我不确定这是否能解释您的问题,但它看起来确实与细胞重复使用有关。
编辑:
好的,您在我输入答案时自己找到了解决方案。 :o)
【讨论】:
【参考方案2】:检查您的条件后不久,您可以通过 indexPath 设置您感兴趣的单元格。然后,也许你想打电话给reloadData
。
【讨论】:
这实际上就是我正在做的事情——我认为没有必要重新加载数据,因为没有新数据需要重新加载。我只是希望该行显示或不显示基于现有数据的指标...它显示正确的标签,那么为什么不显示正确的指标呢? 强制重绘是一种权宜之计【参考方案3】:毕竟答案很简单。当 URL 出现时,我正在设置 UITableViewCellAccessoryDisclosureIndicator。如果没有 URL,我没有做的是设置 UITableViewCellAccessoryNone 。因此,在重绘时,它会记住设置为 on 的一行。
【讨论】:
以上是关于在 UITableViewCell 中使用备用附件类型的主要内容,如果未能解决你的问题,请参考以下文章
在 UITableViewCell 的附件视图中使用自定义按钮的问题
如何在 UITableViewCell 中获得透明的附件视图? (带截图)
UITableViewCell 在自定义单元格中具有备用背景颜色
当附件是UITableViewCellAccessoryCheckmark时,如何将文本置于UITableViewCell中