UITableView insertRowsAtIndexPaths乱序

时间:2010-04-23 18:01:46

标签: iphone uitableview

我目前有一个UISegmentedControl设置,用于在值变化时添加/删除表格视图单元格。删除单元格非常有效,但是当我插入单元格时,它们每隔一段时间就会以相反的顺序运行。

NSArray *addindexes = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:2 inSection:0], [NSIndexPath indexPathForRow:3 inSection:0], [NSIndexPath indexPathForRow:4 inSection:0], nil];
NSArray *removeindexes = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:2 inSection:0], [NSIndexPath indexPathForRow:3 inSection:0], [NSIndexPath indexPathForRow:4 inSection:0], nil];
[self.tableView beginUpdates];

switch (switchType.selectedSegmentIndex) {
    case 0:
        [self.tableView insertRowsAtIndexPaths:addindexes withRowAnimation:UITableViewRowAnimationTop];
        break;
    case 1:
        [self.tableView deleteRowsAtIndexPaths:removeindexes withRowAnimation:UITableViewRowAnimationTop];

        break;
    default:
        break;
}

[self.tableView endUpdates];}

例如,每隔一次我添加/删除单元格它们的顺序相反。 (4,3,2代替2,3,4)
1)去除细胞 - 添加细胞 - 正确的顺序
2)删除细胞 - 添加细胞 - 错误的顺序
3)去除细胞 - 添加细胞 - 正确的顺序

4 个答案:

答案 0 :(得分:1)

您的代码示例显示的所有内容都是索引。单元格的显示顺序由您的tableView:cellForRowAtIndexPath:方法决定。

答案 1 :(得分:0)

每个单元格都创建了一个UITextField。为了防止这种情况被多次抽出,我使用了

if (!someTextField)

由于已经绘制了文本字段,因此导致单元格无法更新。要解决此问题,我只需在删除行时添加[someTextField removeFromSuperview]

答案 2 :(得分:0)

我很惊讶没有人见过这种行为。通过主开关控制的拨动开关的表格视图很容易观察到。例如,这个包含4个部分的表视图的文本表示。在初始加载时,一切都按预期进行:

  

第0节

     
      
  • 第0行/ Toggle标记为0(永久主开关,插入/删除第1-3节)
  •   
     

第1节

     
      
  • 第0行/ Toggle标记 1
  •   
  • 第1行/切换标记 2
  •   
     

第2节

     
      
  • 第0行/ Toggle标记 3
  •   
  • 第1行/切换标记 4
  •   
     

第3节

     
      
  • 第0行/ Toggle标记 5
  •   

关闭主切换开关以删除1-3节,然后再打开以插入1-3节,切换标签的顺序相反:

  

第0节

     
      
  • 第0行/ Toggle标记为0(永久主开关,插入/删除第1-3节)
  •   
     

第1节

     
      
  • 第0行/ Toggle标记 5
  •   
  • 第1行/切换标记 4
  •   
     

第2节

     
      
  • 第0行/ Toggle标记 3
  •   
  • 第1行/切换标记 2
  •   
     

第3节

     
      
  • 第0行/ Toggle标记 1
  •   

我解决这个问题的方法是放弃toggle.tag = myRowIteratorVariable区域内的if( cell == nil )。相反,在该块之后,我将toggle.tag设置为我在数据中预定义的行ID:

- (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UISwitch *toggle = nil;
    ...
    if( cell == nil )
    {
        ...
        toggle = [[UISwitch alloc] init];
        //toggle.tag = myRowIteratorVariable;
        ...
    }

    NSDictionary *section = [myTableViewSectionArray objectAtIndex:indexPath.section];
    NSArray *rowIds = [section objectForKey:@"rowIds"];
    int rowId = [[rowIds objectAtIndex:indexPath.row] intValue];
    toggle.tag = rowId;

    return cell;
}

答案 3 :(得分:0)

我发现在我的情况下,重用单元格值将导致此问题,我通过在返回单元格之前分配新值来解决它