2012-04-07 55 views
0

在我的应用程序中,我有一个详细视图,用户可以在其中编辑例如某人的姓名,地址等属性。UITableViewCell配件重复?

在两个单元格中,他们不能选择它们来编辑其内容,有一个正确的附件,一个UISwitch,但有时它不一致,但它们在我最后一节中复制到其他单元格上。

我一直在用精梳机扫描我的代码几十遍,并找不到该死的原因。什么可能导致这个?下面是我使用的只是一个单细胞创建UISwitch代码:

if (indexPath.section == 0 && indexPath.row == 1) 
{ 
    cell.textLabel.text = @"Confirmed"; 

    //Make the cell unselectable 
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
    //Create and add uiswitch 
    confirmedSwitch = [[UISwitch alloc] initWithFrame:CGRectZero]; 
    [confirmedSwitch addTarget:self action:@selector(switchConfirmedStatus:) forControlEvents:UIControlEventValueChanged]; 
    [confirmedSwitch setOn:[venue.isConfirmed boolValue]]; 
    cell.accessoryView = confirmedSwitch; 
} 

所以你指望它只能出现在该小区,看到什么奇怪与该代码?我检查了我的if语句,并且我所有的括号indexPath检查都是正确的。

任何人看到此之前或有任何线索?

+1

听起来像一个细胞重复使用问题。当你调用'dequeueReusableCellWithIdentifier:'你得到一个循环的单元格 - (你可能已经添加了这个单元格的开关)。你需要做什么删除你回收单元格时添加的视图 – 2012-04-07 00:35:36

+1

这个代码是否在cellForRowAtIndexPath中?你使用单个可重用的单元标识符吗?如果是这样,如果你得到一个缓存单元格,并且*不匹配你的分区/行测试,你会怎么做? – 2012-04-07 00:35:57

+0

啊,我想这个线索的名字是'Reuse'!我正在使用这个,所以只需将我的其他单元的附件视图修改为零即可!猜猜我想的太多了,以为它背后可能会有更大的问题。 – 2012-04-07 00:38:54

回答

3

问题是因为reusability问题在UITableView。您可能对所有单元使用相同的identifier,这会导致cellForRowAtIndexPath在其他行中执行(当您向上和向下滚动时)。

这是一个常见问题,当您使用tableView开发应用程序时,在StackOverflow上有很多这样的问题。

作为一般解决方案,您需要执行其中任何一项。

  1. 当您为每个单元指定dequeueReusableCellWithIdentifier时使用不同的标识符。这很简单,你只需要为它们分配不同的标识符。

  2. 子类你UITableViewController,并创建你自己的CustomTableViewController它将实现必要的组件在cell。我相信你将需要重写set Layout Subviews方法。

0

采取在视图中的阵列将出现和该索引处添加对象0此行和1为所有其它行,然后在的cellForRowAtIndexPath检查,如果阵列具有0,如果它已经然后把切换否则nill ..

for(int i =0;i<10;i++) 
{ 
    if(i==1) 
    { 
     [arrayForSwitch addObject:@"0"]; 
    } 
    else 
    { 
     [arrayForSwitch addObject:@"1"]; 
    } 
} 

然后在写的cellForRowAtIndexPath条件

if([arrayForSwitch objectAtIndex:indexPath.row isEqualToString:@"0"]) 
{ 
    cell.accessoryView = confirmedSwitch; 
} 
else 
{ 

    cell.accessoryView =UITableViewCellAccessoryNone; 
} 

现在将保持相同