我有一个自定义UITableViewCell
,当它被选中时,它会展开并添加UILabel
到我在storyBoard中添加的所选单元格UIView
。
当我运行应用程序并选择一个单元格时,标签会按预期添加到myView
。问题是,当我向下滚动时,标签也显示在另一个单元格中。
显然,它之所以表现如此,是因为我正在重复使用这个细胞而我不会像Emilie所说的那样清理它们。我试图调用prepareForReuse
和'清洁'的方法。细胞,但我在做这件事时遇到了麻烦。这是我的代码:
- (void)prepareForReuse {
NSArray *viewsToRemove = [self.view subviews];
for (UILablel *v in viewsToRemove) {
[v removeFromSuperview];
}
这样做,甚至可以清除所选的单元格标签。
- (void)viewDidLoad {
self.sortedDictionary = [[NSArray alloc] initWithObjects:@"Californa", @"Alabama", @"Chicago", @"Texas", @"Colorado", @"New York", @"Philly", @"Utah", @"Nevadah", @"Oregon", @"Pensilvainia", @"South Dekoda", @"North Dekoda", @"Iowa", @"Misouri", @"New Mexico", @"Arizona", @"etc", nil];
self.rowSelection = -1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CategorieCell *customCell = [tableView dequeueReusableCellWithIdentifier:@"cellID" forIndexPath:indexPath];
customCell.title.text = [self.sortedDictionary objectAtIndex:indexPath.row];
return customCell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
CategorieCell *customCell = (CategorieCell *)[tableView cellForRowAtIndexPath:indexPath];
if (self.info) {
[self.info removeFromSuperview];
}
self.info = [[UILabel alloc] init];
[self.info setText:@"Hello"];
[self.info setBackgroundColor:[UIColor brownColor]];
CGRect labelFrame = CGRectMake(0, 0, 50, 100);
[self.info setFrame:labelFrame];
[customCell.infoView addSubview:self.info];
NSLog(@"%ld", (long)indexPath.row);
self.rowSelection = [indexPath row];
[tableView beginUpdates];
[tableView endUpdates];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([indexPath row] == self.rowSelection) {
return 159;
}
return 59;
}
答案 0 :(得分:1)
答案很简单:你可以像你应该那样重复使用你的细胞,但永远不要清理它们
重复使用UITableViewCell
表示您之前点击的单元格将在屏幕外显示时重复使用。
点击后,您可以向UITableViewCell
添加视图。重用时,视图仍然存在,因为您永远不会删除它。
您有两种选择:一,您可以设置self.info视图的标记(或使用您保留在内存中的索引路径进行检查),然后在信息视图存在时检查您何时将单元格出列,并且去掉它。更干净的解决方案是通过覆盖自定义prepareForReuse
UITableViewCell
方法来实现视图删除
<强>精密强>
您需要做的第一件事是在初始化后为self.info视图设置一个标记:
[self.info setTag:2222];
如果您希望尽可能简单,可以直接在cellForRowAtIndexPath
方法中检查并删除self.info视图:
CategorieCell *customCell = [tableView dequeueReusableCellWithIdentifier:@"cellID" forIndexPath:indexPath];
customCell.title.text = [self.sortedDictionary objectAtIndex:indexPath.row];
if [customCell.infoView viewWithTag: 2222] != nil {
[self.info removeFromSuperview]
}
return customCell;
我不确定此代码编译的百分比,我暂时无法测试它。希望它有效!