2010-02-10 4 views
0

У меня есть подкласс UITableViewCell, который содержит несколько элементов - UIImageViews, Labels и т. Д.
Поскольку эта ячейка предназначена для повторного использования, я хочу иметь возможность немного изменить ее внешний вид в зависимости от данных, отображаемых в настоящее время.UITableViewCell не очищает контекст перед рисованием

Так как пример - у меня есть этот вид в моем обычае UITableViewCell:

UIImageView* delimeterView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cellDelimiter.png"]]; 

Что я хочу, чтобы иметь возможность скрыть иногда так:

- (void) setRecord:(id)record__ { 
    if (record__.type == NO_DELIMETER_VIEW) 
     delimeterView.hidden = YES; 
    else 
     delimeterView.hidden = NO; 
    [self setNeedsLayout]; 
} 

Но проблема в том, что delimeterView всегда будет отображаться в ячейке, точно так же, как если бы он был нарисован один раз в методе init, а затем контекст рисования никогда не изменялся и не очищался. Я попытался установить свойство clearsContextBeforeDrawing на YES как для ячейки, так и для ее содержимогоView. Я также попытался установить непрозрачность для ячейки, а ее contentView - нет, так как я прочитал, могут возникнуть некоторые проблемы с этим, если вы используете прозрачный Просмотры.
Ничего не помогает.
Похоже, что UITableViewCell никогда не очищает свой графический контекст и просто рисует поверх старых элементов.
Любые советы о том, что я делаю неправильно? Я знаю, что могу исправить это, выполнив индивидуальный рисунок, но я бы предпочел.

+0

И вы вызываете -setRecord: в ячейке каждый раз, когда вы ее возвращаете, - [UITableView cellForRowAtIndexPath:] (или он передан - [UITableViewDelegate tableView: willDisplayCell: forRowAtIndexPath:])? –

+0

Да, он предназначен для вызова каждый раз в методе cellForRowAtIndexPath. – Alexey

ответ

1

Во-первых, вы уверены, что delimeterView в setRecord: на самом деле указывает на ваш delimeterView? В приведенном ниже примере кода вы назначаете его локальному. Позже вы назначили это для ivar? (Вы всегда должны использовать accessors для доступа к ivars: self.delimeterView).

Затем, вызывая -setNeedsLayout, просто назначается вызов -layoutIfNeeded, который выполняет вызов иерархии -layoutSubviews. Реализация по умолчанию -layoutSubviews ничего не делает. Вы, вероятно, хотели бы позвонить -setNeedsDisplay здесь, или вам нужно реализовать -layoutSubviews, чтобы делать то, что вы хотите.

+0

Хорошо, да, setNeedsDisplay был на самом деле правильным методом. Спасибо что подметил это. – Alexey

Смежные вопросы