Почему drawAtPoint создает дубликаты изображений в представлении содержимого моей табличной ячейки?

У меня есть вид с пользовательским слайдером. Мы используем подкласс TableViewController, который генерирует экземпляры UITableViewCell. Внутри каждого tableViewCell мы добавляем наш пользовательский слайдер (представление пользовательского интерфейса) в качестве подпредставления. Здесь у нас есть вид, который служит регулятором ползунка. Это просто подкласс UIView с распознавателем жестов. Метод drawRect для класса ручки управления принимает UIImage и выполняет drawAtPoint. Это прекрасно работает! Подводя итог, мы имеем:

UITableView -> UITableViewCell -> UITableViewCell.contentView -> SliderView -> SliderKnob -> UIImage

Проблема возникает, когда мы прокручиваем ячейку таблицы из табличного представления. UIImage для ручки сохраняется. В итоге мы получаем дубликат изображения, оставшегося при каждом снятии очереди с ячейки. Я настроил несколько операторов NSLog и подтвердил, что drawRect вызывается в каждом из подпредставлений. Есть ли что-то, что мне нужно сделать, чтобы обновить рендеринг ячейки? Я пытался использовать setNeedsDisplay на подпредставлениях UITableViewCell, но не смог предотвратить дублирование UIImage.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"SliderView";
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:CellIdentifier] autorelease];
    }

    SliderView *slider = [[[SliderView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 130)] autorelease];

    // Configure the data for the cell.
    NSDictionary *dataItem = [data objectAtIndex:indexPath.row];
    slider.dimensionName = [dataItem objectForKey:@"Name"];
    slider.upperExtreme = [dataItem objectForKey:@"Upper Extreme"];
    slider.lowerExtreme = [dataItem objectForKey:@"Lower Extreme"];
    slider.score = [[dataItem objectForKey:@"Score"] intValue];

    cell.selectionStyle = UITableViewCellEditingStyleNone;
    cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"track_grainy.png"]];
    [cell.contentView addSubview:slider];

    return cell;
}

1 ответ

Решение

Проблема заключалась в том, что мы были начинающими программистами и выделяли новый экземпляр SliderView при каждом обновлении ячейки. Это явно очень плохо. В итоге мы создали подкласс UITableViewCell и создали экземпляр нашего пользовательского представления контента в init с помощью frame. Делая это, мы можем сохранить пользовательский вид в памяти и обновить его, обновив ячейку. Затем он правильно освобождается, когда ячейки освобождаются из табличного представления.

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