iPhone - 保持TableView状态的最简单方法是什么?

4

我目前有一个简单的表格视图,其中有7个单元格。当选择一行时,我会在单元格中添加一个勾选标记,反之亦然,当选择已经被勾选的单元格时,它将取消勾选。

但是,当我退出表格视图并返回时,所有勾选标记都消失了。

我想知道在iOS中最简单的解决方案是什么,以保持勾选单元格的状态,以便当我返回到表格视图时,勾选标记仍然存在于已勾选的单元格中?

5个回答

2

1
最简单的方法是将这些选中状态保存在表视图中的某个位置。这假设您离开屏幕时,您的表视图仍然留在内存中。如果表视图没有保存在内存中(例如,当您决定导航到该视图时进行分配,并在离开时释放),那么最简单的方法可能是将其保存在应用程序委托中的某个位置,因为我们知道它会在整个应用程序生命周期中保持在内存中。

这是一个非常糟糕的建议,并且违反了MVC模式。他想要的是在提供单元格的数据源上保持状态,而不是在表格视图本身上。 - jer
我不明白为什么这会破坏MVC模式,除了我选择的位置来描述保存数据并不是显式的“模型”对象之外,也不知道为什么这会成为一个不好的建议。 - Dan F
您选择的位置来描述数据保存的位置是视图对象(tableview),即使在视图保存此类信息可以接受,但这将成为该情况下单元格属性的错位。然而,即使是这样,也是错误的,因为这是用于填充单元格的数据,并不是单元格绘制代码等的一部分。这是经典的数据模型、数据。 - jer
如果您正在使用tableView:cellForRowAtIndexPath:,那么让表格知道它应该用什么来填充单元格有什么问题吗? - Dan F
那不是TableView...那是它的数据源,这是正确的做法,就像我之前提到的那样。 - jer

1

你需要做的是在提供每个单元格数据的数据模型上添加一个标志(如果你还没有),用于指示这种情况。确保在tableView:cellForRowAtIndexPath:中根据该特定单元格的数据模型设置单元格上的复选标记。

当你回到它时,只要你的数据源没有改变,在显示表视图之前,当表视图再次设置其单元格时,它将使用该数据来显示基于数据源设置的复选标记。


0

将状态保存在NSUserDefaults中。

在您的didSelectRowAtIndexPath tableView委托方法中,使用以下代码设置用户默认值:

NSUInteger defaultsCheckedRow=[[NSUserDefaults standardUserDefaults] integerForKey:@"rowForCheckedCellInNameOfTableViewController"];
if (defaultsCheckedRow==indexPath.row){
   // deselect the row 
   defaultsCheckedRow=defaultsCheckedRow*-1;
}else{
   defaultsCheckedRow=indexPath.row;
}
[[NSUserDefaults standardUserDefaults] setInteger: defaultsCheckedRow forKey: "rowForCheckedCellInNameOfTableViewController"]
[[NSUserDefaults standardUserDefaults] synchronize];
[self.tableView reloadData];

然后在你的cellForRowAtIndexPath:数据源代理方法中,你可以做类似以下的事情:

NSUInteger defaultsCheckedRow=[[NSUserDefaults standardUserDefaults] integerForKey:@"rowForCheckedCellInNameOfTableViewController"];
if (indexPath.row==defaultsCheckedRow){
   cell.accessoryType=UITableViewCellAccessoryCheckmark;
}else{
   cell.accessoryType=UITableViewCellAccessoryNone;
}

0

将TableView状态存储在SQLite中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接