Селективные ячейки TableViewController отменяются при перезагрузке таблицы - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть проблема, когда некоторые ячейки отменяются, когда я пытаюсь перезагрузить строки / таблицу с контроллером обновления и сразу прокрутить просмотр таблицы.я проверил это с отменой выбора в diSelectrow и didDeselectRow. В обоих методах счетчик отладки не встречается.у меня есть следующий код в cellforRow

if (isEditClicked == true || [indexarray containsObject:indexPath]) {
    [cardinboxCardCell setSelectionStyle:UITableViewCellSelectionStyleDefault];
}

следующий в didselectrow

if (!self.tableView.isEditing) {
    Card *card;
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    card = [_fetchedResultsController objectAtIndexPath:indexPath];
    [self performSegueWithIdentifier:@"pushToMyCardDetails" sender:card];
}else {
    selectedDeleteCardCount += 1;
    if (deleBtn) {
        [deleBtn setEnabled:true];
    }
    [indexarray addObject:indexPath];
    NSString* cardsCount = [NSString stringWithFormat:@"(%d)",selectedDeleteCardCount];
    [self.navigationController.navigationBar.topItem setTitle:cardsCount];
}

следующий в didDeselctrow

if (self.tableView.isEditing) {
    selectedDeleteCardCount -= 1;
    NSString* cardsCount = [NSString stringWithFormat:@"Inbox"];
    [indexarray removeObject:indexPath];
    if (selectedDeleteCardCount != 0){
        cardsCount = [NSString stringWithFormat:@"(%d)",selectedDeleteCardCount];
        if (deleBtn) {[deleBtn setEnabled:true];}
    }else {
        if (deleBtn) {[deleBtn setEnabled:false];}
    }
    [self.navigationController.navigationBar.topItem setTitle:cardsCount];
}

Ответы [ 4 ]

0 голосов
/ 23 ноября 2018

Не пытайтесь поддерживать выбранное состояние в пользовательском интерфейсе.Сохраните его независимо, чтобы его можно было восстановить при перезагрузке таблицы.

Я бы вообще не рекомендовал хранить выбранные индексы или indexPaths, так как отношения между ними и вашей моделью могут измениться, если элементы будут вставлены / удалены / переупорядочены,(может не применяться в вашем случае, но все же лучше избежать этой потенциальной проблемы)

Вместо сохранения выбранных объектов модели, вы всегда будете точно знать, что выбрано, и ничто не может помешать этому.Просто сделайте изменяемый массив 'selected' и добавьте его, если необходимо.

didSelectRowAtIndexPath - это место, где вы добавляете / удаляете объект модели из выбранного массива.cellForRowAtIndexPath - это то место, где вы устанавливаете выбранное состояние ячейки в зависимости от выбранного массива.

0 голосов
/ 21 ноября 2018

Вы просто должны поддерживать состояния для всех ячеек.Вы можете использовать Bool isSelected.Всякий раз, когда вы выбираете какую-либо ячейку, отметьте ее как истинную в индексе состояния.так же, как отменить выделение пометить как ложное:-)

0 голосов
/ 21 ноября 2018

Чтобы добиться того, что вы ищете, ваша установка должна выглядеть примерно так:

enter image description here

Теперь сосредоточимся на этой части:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    NSDictionary *object = _objects[indexPath.row];
    cell.textLabel.text = object[@"text"];
    cell.imageView.image = [UIImage imageNamed:object[@"image"]];
    if (_selectedIndexPaths[[self getKey:indexPath]] != nil) cell.selected = [_selectedIndexPaths[indexPath] boolValue];
    return cell;
}

- (NSString *) getKey : (NSIndexPath *) path {
    return [NSString stringWithFormat:@"%ld-%ld", (long)path.section, (long)path.row];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [_selectedIndexPaths setValue:@(TRUE) forKey:[self getKey:indexPath]];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    [cell setSelected:true];

    //[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}

Как вы можете видеть, мы устанавливаем значение в _selectedIndexPaths, пока ячейка выделена, а когда в ячейке построено, эта проверка позволяет нам поддерживать выделение живым.Вы можете использовать тот же шаблон с аксессуаром checkMark.

0 голосов
/ 21 ноября 2018

У меня есть сомнения по поводу объекта indexpath, возможно, этот объект изменился .. вот почему это условие не выполняется

if (isEditClicked == true || [indexarray containsObject:indexPath]) {

Мой совет вам: проверка с индексом раздела и строки не для самого объекта, подобного этому

//find indexPath (row and section) in indexarray using for loop to retrive whether 
//is this cell is selected or not

     bool isCellSelected = [self currentIndexPathSelected:indexPath];
    if (isEditClicked == true || isCellSelected) {
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...