Как узнать, была ли выбрана строка в UITableView?
Я использую MultiSelectTableView от Apple как способ узнать о 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];
}
Когда я регистрирую отладчик при загрузке представления, индекс становится нулевым.
2 ответа
Наборы индексов не являются правильным инструментом для выбора нескольких строк в табличных представлениях, поскольку данные табличного представления представлены разделами и строками, в то время как наборы индексов содержат одномерные индексы.
Если вы хотите сохранить множественный выбор, вы можете использовать -[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];
}