Как узнать, была ли выбрана строка в 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];

}
Другие вопросы по тегам