[英]How to know if a row in a UITableView has been selected?
我使用Apple的MultiSelectTableView作为了解NSIndexSet
。 我可以轻松地创建所选项目并在调试器中将其读回。
当应用程序再次运行时,我尝试了几种方法来“读取”该设置,但我无法弄清楚这一点。 因此,如果我选择几行并退出应用程序,则下次运行时,选择不会持续。 我读过这篇文章 ,其中包括,但我只是不喜欢它。
我一直在尝试使用NSUserDefaults
:
NSMutableIndexSet *indicesOfItemsToShow = [NSMutableIndexSet new];
for (NSIndexPath *selectionIndex in selectedRows)
{
[indicesOfItemsToShow addIndex:selectionIndex.row];
NSLog(@"selectionIndex.row: %i", selectionIndex.row);
NSUserDefaults *standardDefaults;
[standardDefaults setObject:selectionIndex forKey:@"currentState"];
[standardDefaults synchronize];
}
当我在视图加载时记录调试器时,索引为空。
索引集不是用于表视图中多行选择的正确工具,因为表视图数据由节和行表示,而索引集包含一维索引。
如果希望保留多个选择,可以使用-[UITableView indexPathsForSelectedRows]
,它返回NSIndexPath
对象的数组。 然后你可以持久化这个数组,并在加载时读取数组并使用-[UITableView selectRowAtIndexPath:animated:scrollPosition:]
来选择正确的单元格。
此外,您似乎错误地保存到用户默认值。
NSUserDefaults *standardDefaults;
[standardDefaults setObject:selectionIndex forKey:@"currentState"];
应该
NSUserDefaults *standardDefaults = [NSUserDefaults standardDefaults];
[standardDefaults setObject:selectionIndex forKey:@"currentState"];
提醒一句。 根据您在表视图中填充数据的方式,这对于保留所选行的索引可能是不安全的。 跟踪选择哪个后备对象并使用此信息选择行会更好。 但对于静态数据,这没关系。
为了进一步解释如何坚持选择,这里有一个例子:
- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
NSArray* selectedRows = [tableView indexPathsForSelectedRows];
NSMutableArray* safeForUserDefaults = [NSMutableArray new];
[selectedRows enumerateObjectsUsingBlock:^(NSIndexPath* indexPath, NSUInteger idx, BOOL *stop)
{
NSDictionary* data = @{@"section": @(indexPath.section), @"row": @(indexPath.row)};
[safeForUserDefaults addObject:data];
}];
[[NSUserDefaults standardDefaults] setObject:safeForUserDefaults forKey:@"currentState"];
}
现在,加载:
- (void)viewDidLoad
{
NSArray* previousState = [[NSUserDefaults standardDefaults] objectForKey:@"currentState"];
[previousState enumerateObjectsUsingBlock:^(NSDictionary* data, NSUInteger idx, BOOL *stop)
{
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[data[@"row"] integerValue] inSection:[data[@"section"] integerValue]] animated:NO scrollPosition:UITableViewScrollPositionNone];
}];
}
这是一个非常简单的例子,但应该让你顺利。
在您退出应用程序之前,将self.storeIndexArray添加到NSUserDefaults
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self.storeIndexArray addObject:indexPath];
}
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
[self.storeIndexArray removeObject:indexPath];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.