2012-04-05 3 views
0

У меня есть UITable, который имеет более 200+ ячеек. Таблица прекрасно работает с данными, поступающими из сети. Теперь мне нужно добавить способ изменить цвет фона ярлыка, чтобы он соответствовал данным (красный, если значение уменьшилось и было зеленым, если значение увеличилось). Кажется, что это хорошо работает, но через некоторое время цвета становятся статическими, даже если значения обновляются нормально. Ниже приведен пример моего кода, который находится в методе layoutSubviews:Цвет не изменяется в UITableViewCells

Update

Я обновил код, чтобы показать мой мой стол. Обратите внимание, что данные передаются в ячейку отлично. Это цвет ячейки, который отказывается менять через несколько минут, независимо от того, что это за значение.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     UILabel* label = [[UILabel alloc] initWithFrame:self.contentView.bounds]; 
     label.tag = 1; 
     [cell.contentView addSubview:label]; 
     [label release]; 
    } 
    UILabel *label = (UILabel*)[cell viewForTag:1]; 
    float value = [label.text floatValue]; 
    float newValue = [dataSource objectAtIndex:indexPath.row]; 

    // Get the current value of the cell and compare it with the new value 
    if(value < newVal) 
    { 
     label.backgroundColor = [UIColor greenColor]; 
    } 
    else if(value > newVal) 
    { 
     label.backgroundColor = [UIColor redColor]; 
    } 
    label.text = [NSString stringWithFormat:@"%d", newValue]; 
} 
+0

Почему этот код в layoutSubviews? Это не каждый раз будет называться. Он должен быть в cellForRowAtIndexPath. – jrturton

+0

Прочитав ответ ниже, я переместил код в нужное место. Спасибо, что заметили. – Seb

ответ

0

Вы сравниваете значение из вашего источника данных к значению, которое было ранее, отображаемое в ячейке.

Это не будет допустимым сравнением. У вас будет что-то вроде 8 или 10 полных экземпляров вашей ячейки, которые будут удалены и повторно использованы. Таким образом, вы будете сравнивать источник данных, скажем, ячейки 60, с последним значением, используемым в этой ячейке, которое могло быть из строки 45. Это бессмысленно.

Вам нужно сохранить старое значение где-то в вашем источнике данных и сравнить его с этим.

+0

Создал бы словарь и сохранил бы индекс строки и старое значение? Таким образом, когда я снова сделаю сравнение, я могу вытащить старое значение из словаря на основе строки, которая ему нужна? – Seb

+0

Да, или ваш источник данных может быть массивом словарей, каждый с двумя ключами, старым и новым значением. – jrturton

+0

Это казалось так. Благодарим вас за помощь и немного углубляемся в UITableViewCell. Я понял, что ячейки были повторно использованы, я не понял, почему ячейки, которые были в поле зрения, будут повторно использованы. – Seb

0

Установка цвета фона ячейки не будет работать, потому что есть другой вид, его contentView, сидящий поверх этого. Поскольку iOS обрабатывает рисунок как холст художника, contentView препятствует любым изменениям, которые вы делаете на фоне ячейки. Однако вы можете установить цвет фона в contentView (это UIView, в конце концов), и вы должны увидеть свои зеленые и красные цвета.

+0

Пока я могу видеть цвета, я получаю ту же проблему, что и в предыдущем упоминании. Спустя некоторое время цвета больше не обновляются. Я пробовал прокручивать, чтобы увидеть, поможет ли это, но те же ячейки всегда устанавливаются в один и тот же цвет независимо от того, какое значение он получает. – Seb

0

Возможно, это из-за deQueue, что вы можете попробовать, прежде чем добавлять новые подзоны в свою ячейку, запускать цикл и удалять из него все подпункты. Убедитесь, что вы сделаете это после проверки состояния нулевой ячейки.

for(UIView *subview in cell.subviews){ 
    [subview removeFromSuperview]; 
} 

Может помочь

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