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 滚动时奇怪的布局行为变化

滚动 UITableView 的奇怪行为

UITableView 方法“indexPathForRowAtPoint:”的奇怪行为

水平滚动 UITableView 的奇怪行为(在 Monotouch 中)

在模态显示的 UIViewController 中使用 UITableView 时的奇怪行为