Проблема изменения UITableViewCell accessoryType в tableView: didSelectRowAtIndexPath: - PullRequest
2 голосов
/ 26 октября 2010

У меня прозрачное табличное представление (UIViewController с подпредставлением UIImageView и другое подпредставление UITableView поверх родственного элемента UIImageView с background = clearColor, UITableViewCells background = clearColor). Я также хочу, чтобы касания в ячейках переключали accessoryType ячейки между галочкой и ни одной. Если я изменяю accessoryType UITableViewCell в tableView: didSelectRowAtIndexPath :, иногда (30-50% времени, как на симуляторе ios4.1, так и на iphone 3GS, работающем под os4.1) при переключении с accessoryType None на accessoryType, отмечайте галочкой изображение галочки окрашивается на непрозрачном белом фоне вместо прозрачного фона. Если вместо этого я перезагружаю таблицу (где accessoryType также устанавливается соответствующим образом для каждой ячейки), прозрачность работает правильно 100% времени.

Это ошибка? Или изменение ячейки в tableView: didSelectRowAtIndexPath: не правильная вещь, и вместо этого следует перезагрузить эту строку? Или что-то еще мне не хватает?

edit: вот мой код didSelectRowAtIndexPath, который показывает нежелательное поведение:

edit 2: Еще одна деталь того, что происходит. Это самый конец анимации отмены выбора, где возникает проблема. Галочка появляется и отображается правильно и прозрачно во время анимации отмены выбора, а выделение синего цвета постепенно исчезает. После завершения анимации отмены выбора и исчезновения синего цвета, возможно, 1/10 секунды после того, как цвет выделения полностью исчезает, это происходит, когда вспомогательное средство галочки «автоматически» становится непрозрачным без дальнейшего ввода пользователем.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if ( self.editing )
    {
    }
    else 
    {
        [self.myTableView deselectRowAtIndexPath:indexPath animated:YES];
        UITableViewCell *cell = [self.myTableView cellForRowAtIndexPath:indexPath];

        // toggle the selection status of the selected row
        //
        NSNumber *rowObj = [NSNumber numberWithUnsignedInt:indexPath.row];
        if ( [self.selectedRows containsObject:rowObj] )
        {
            // currently selected, now de-select
            //
            cell.accessoryType = UITableViewCellAccessoryNone;
            [self.selectedRows removeObject:rowObj];
        }
        else 
        {
            // currently unselected, now select
            //
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
            [self.selectedRows addObject:rowObj];
        }
    }
}

Ответы [ 4 ]

2 голосов
/ 16 марта 2011

Я думаю, что будет чище, если вы переместите код выбора кода в

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

и на didSelectRowAtIndexPath вызов

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

Таким образом, вы перезагрузите только выбранную строку, как только она будет выбрана, и нет необходимости вызывать reloadData.Надеюсь, это поможет!

1 голос
/ 09 августа 2011

Это сообщение не обновлялось в течение 4 месяцев, но я решил, что отправлю свое решение, так как оно работает, и может помочь кому-то еще с подобной проблемой.

Все происходит в методе didSelectRowAtIndexPath. Я называю self.view табличным представлением (поэтому замените его именем вашего табличного представления, например, self.tableView)

// let's go through all the cells to update them as I only want one cell at a time to have the checkmark next to it
for (int i=0; i<[self.detailsArray count]; i++) {
    // whenever we reach the cell we have selected, let's change its accessoryType and its colour
    if (i == indexPath.row) {
        // that's the row we have selected, let's update its 
        UITableViewCell *cell = [self.view cellForRowAtIndexPath:indexPath];
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        cell.textLabel.textColor = [UIColor colorWithRed:51.0f/255.0f green:102.0f/255.0f blue:153.0f/255.0f alpha:1.0f];
    }
    // if it isn't the cell we have selected, let's change it back to boring dark colour and no accessoryType
    else {
        UITableViewCell *cell = [self.view cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.textLabel.textColor = [UIColor darkTextColor];
    }
}

// don't forget to deselect the row
[self.view deselectRowAtIndexPath:indexPath animated:YES];
0 голосов
/ 27 февраля 2011

При отладке другой проблемы в несвязанном проекте с пользовательской анимацией выбора строки таблицы я обнаружил, что если стиль выбора ячейки не UITableViewCellSelectionStyleNone, то любые изменения в ячейке, выполняемые в didSelectRowAtIndexPath, подвержены сбоям и другим желательным результатамизменения, внесенные в ячейку N, не отображаются до тех пор, пока ячейка! = N не будет выбрана позже, а анимации, выполненные для ячейки, никогда не будут отображаться вообще).Когда я изменил стиль выделения на UITableViewCellSelectionStyleNone, все изменения визуальных ячеек, сделанные в didSelectRowAtIndexPath, сразу же появляются без проблем.

0 голосов
/ 03 февраля 2011

этот метод UITableViewDelegate:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

вызывается непосредственно перед отображением ячейки.Модификация вашего внешнего вида должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...