UITableView 奇怪的行为
Posted
技术标签:
【中文标题】UITableView 奇怪的行为【英文标题】:UITableView strange behavior 【发布时间】:2011-06-04 17:45:34 【问题描述】:我正在编写一个带有 UITableView 的首选项面板,如下所示:
第一部分包含简单的行,第二部分包含 UISwitch 作为子视图的行。
当我更改为横向并开始滚动时,tableview 的行为方式很奇怪:
这是我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
// Configure the cell
if (indexPath.section == 0)
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
if (indexPath.row == 0)
cell.textLabel.text = @"Help";
else if (indexPath.row == 1)
cell.textLabel.text = @"About us";
else if(indexPath.row == 2)
cell.textLabel.text = @"Send to a friend";
else if(indexPath.section == 1)
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
if (indexPath.row == 0)
cell.textLabel.adjustsFontSizeToFitWidth = NO;
cell.textLabel.text = @"Show favs at launch";
[cell addSubview:favoritesSwitch];
else if (indexPath.row == 1)
cell.textLabel.text = @"Open with Safari";
[cell addSubview:browserSwitch];
else if(indexPath.row == 2)
cell.textLabel.text = @"Remember query";
[cell addSubview:lastQuerySwitch];
else if(indexPath.row == 3)
cell.textLabel.text = @"Automatic keyboard";
[cell addSubview:keyboardSwitch];
return cell;
提前谢谢你:)
【问题讨论】:
【参考方案1】:您应该执行以下操作:
继续对所有单元格使用相同的 CellIdentifier(性能!如果您为每个单元格创建一个新标识符,它将起作用,但会消耗大量内存)。仅当您的单元格根本不同时才适合使用多个单元格标识符,例如不同的自定义 UITableViewCell-Subclass。
不要将您的开关添加为子视图 (!!!),请改用 cell.accessoryView = mySwitch
。如果此单元格不应该有开关,请务必设置cell.accessoryView = nil
以清理单元格以供重用。为您的 Switch 使用 accessoryView 将自动处理所有布局工作。
当您将附件视图设置为 nil 时,您可以在重用单元格时继续为您的 DetailDisclosure-Buttons 使用附件类型!
【讨论】:
【参考方案2】:这可能是因为您使用相同的单元格标识符来访问表格单元格。
试试
NSString *CellIdentifier = [NSString stringWithFormat:@"Cell %d_%d",indexPath.section,indexPath.row];
而不是。
static NSString *CellIdentifier = @"Cell";
【讨论】:
谢谢 :D 成功了!但是,为什么我的 CellIdentifier 不起作用? 只是一个注释。这是不正确的。您不需要每个单元格都有唯一的单元格标识符。这违背了使用小区标识符的原因。使用单元标识符允许系统快速回收类似的单元以获得更快的性能。你应该做的是根据它们的类型给单元格标识符。在您的情况下,为所有单元格提供相同的标识符并将开关分配给 cell.accessoryView 会好得多,您可以在重用时对其进行访问和更改。 Martin Ullrich 的回答是正确的。 这肯定不是做事的方式。您要么制作自定义单元格(根据其索引路径隐藏取消隐藏视图),要么像 Martin Ullrich 建议的那样处理它。【参考方案3】:tableView 正在回收已添加 browserSwitch、lastQuerySwitch 和 keyboardSwitch 的单元格。这些都不会从单元格视图中删除。在 // 配置单元格注释之后添加以下行。我想这样就可以解决了。
[browserSwitch removeFromSuperview];
[lastQuerySwitch removeFromSuperview];
[keyboardSwitch removeFromSuperview];
【讨论】:
以上是关于UITableView 奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章
奇怪的行为 UIActionSheet + UITableView:行消失
UITableView 方法“indexPathForRowAtPoint:”的奇怪行为