重新排序表视图单元格位置不会保留

时间:2013-02-12 04:21:30

标签: iphone ios xcode uitableview

我使用以下代码重新排序我的TableViewCells:

- (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath{
[self.ammoTable moveRowAtIndexPath:indexPath toIndexPath:[NSIndexPath indexPathForRow:[self.tableArray count] - 1 inSection:1]];
}

-(IBAction)setEdit{
if ([self.button.currentTitle isEqualToString:@"Edit"]) {
    self.ammoTable.editing = YES;
    [self.button setTitle:@"Done" forState:UIControlStateNormal];
}
else{
    self.ammoTable.editing = NO;
    [self.button setTitle:@"Edit" forState:UIControlStateNormal];

}
}

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath   
*)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
    // fetch the object at the row being moved
NSString *r = [self.tableArray objectAtIndex:fromIndexPath.row];

    // remove the original from the data structure
[self.tableArray removeObjectAtIndex:fromIndexPath.row];

    // insert the object at the target row
[self.tableArray insertObject:r atIndex:toIndexPath.row];

[self.ammoTable reloadData];
}

除非您离开视图并返回视图,否则一切都很有效。如果我移动细胞,当视图重新出现时,它们都按照它们所处的原始顺序排列。这有什么理由吗?谢谢你的帮助!

5 个答案:

答案 0 :(得分:0)

我假设您正在从某种数组中加载数据。除了移动表格中的单元格外,还必须对此数组执行相同的操作。

答案 1 :(得分:0)

您需要保留对tableArray属性所做的更改,以便在下次显示视图时再次重新加载该数组时,将按新顺序加载行。

答案 2 :(得分:0)

因为您正在使用旧数组重新加载tableview,即不使用更新的数组 这意味着你要重新初始化你的数组,它可能在viewDidLoad中。 创造&在appDelegate中初始化你的数组。使用这个数组&移动单元格时进行更改,它将保持元素的顺序。

点击how to create & access array from appDelegate

的链接

答案 3 :(得分:0)

当您在tableview单元格中进行更改时,您还需要在表格中进行相同的更改。否则,tableview单元格将按照数组中的顺序加载。

答案 4 :(得分:0)

@Alex

  

为什么当我不重新排序单元格时,数组会自动进行   还记得订单吗?但如果我想重新订购我必须手动制作它   还记得国家吗?

你看到Alex,数组不记得任何顺序,它是根据数组排列自己的表。这是数据源的重点。操纵数据源,您可以操作表。但是操纵表不会改变数据源。因此,如果要对表进行一些更改,请记住事先更改dataSource以反映相同的情况。

  

例如。假设您要从表中删除一行。如果你去    commitEditing 方法只需删除该行,您就会结束   崩溃,无效更新或不一致异常。你需要   首先从中删除相应单元格的数据   dataSource,然后删除该行。

在您的情况下相同..首先交换数据数组中的对象,然后相应地移动行。

希望我很清楚。干杯,玩得开心。