我目前有一个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)去除细胞 - 添加细胞 - 正确的顺序
答案 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)
我发现在我的情况下,重用单元格值将导致此问题,我通过在返回单元格之前分配新值来解决它