2012-04-05 6 views
0

200 개가 넘는 셀을 가진 UITable이 있습니다. 이 테이블은 네트워크에서 들어오는 데이터와 함께 아름답게 작동합니다. 이제 데이터와 일치하도록 레이블의 배경색을 변경하는 방법을 추가해야합니다 (값이 감소하면 빨간색, 값이 증가하면 녹색). 이것은 초기에는 잘 작동하는 것으로 보이지만 잠시 후에 값이 잘 갱신 되더라도 색상은 정적이됩니다. 내가 내 테이블을 표시하는 코드를 업데이트 한색상이 UITableViewCells에서 변경되지 않습니다.

업데이트 : 아래 layoutSubviews 방법에 내 코드의 예입니다. 데이터는 셀에 완벽하게 할당됩니다. 값이 무엇이든간에 몇 분 후에 변경을 거부하는 것은 셀의 색입니다.

- (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

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

은 도움이 될 수 있습니다.

이것은 유효한 비교가 될 수 없습니다. 대기열에서 제외되고 재사용되는 셀의 총 인스턴스가 8 개 또는 10 개가됩니다. 따라서 셀 60의 데이터 소스와이 셀에 사용 된 마지막 값을 비교할 것입니다.이 셀은 행 45에서 나온 것일 수 있습니다. 이는 의미가 없습니다.

데이터 소스에 어딘가에 이전 값을 저장하고 그 값을 대신 비교해야합니다.

+0

사전을 만들고 행 인덱스와 이전 값을 저장하면 되나요? 그런 식으로 비교를 다시 할 때 필요한 값을 기준으로 사전에서 이전 값을 가져올 수 있습니까? – Seb

+0

예, 또는 데이터 소스가 사전의 배열이 될 수 있습니다. 각 배열에는 이전 키와 새 값이라는 두 개의 키가 있습니다. – jrturton

+0

그럴 것 같았습니다. 도와 주셔서 감사 드리며 UITableViewCell에 대해 좀 더 자세히 살펴 보겠습니다. 세포가 재사용된다는 것을 알았지 만, 내가 이해하지 못했던 것은 왜 보이는 세포가 재사용 될 수 있었는지였습니다. – Seb

0

셀의 배경색을 설정하면 다른보기, contentView가 위에 있기 때문에 작동하지 않습니다. iOS는 화가의 캔버스처럼 그리기를 처리하므로 contentView는 셀의 배경에 변경 한 내용을 차단합니다. 그러나 contentView에서 배경색을 설정할 수 있습니다 (결국 UIView가됩니다). 그러면 녹색과 빨간색 색상이 나타납니다.

+0

색상을 볼 수 있지만 원래 언급 한 것과 동일한 문제가 발생합니다. 잠시 후 색상이 더 이상 업데이트되지 않는 것 같습니다. 그게 도움이 될지 알아보기 위해 스크롤을 시도했지만, 같은 셀은 어떤 값을 설정했는지에 관계없이 항상 같은 색으로 설정됩니다. – Seb

0

deQueue로 인해 발생할 수 있습니다. 셀에 새 하위 뷰를 추가하기 전에 시도해 볼 수있는 것은 루프를 실행하고 하위 뷰를 모두 제거하기 전입니다. 널 세포의 상태를 확인한 후에해야합니다. 당신은 이전에 셀에 표시 한 값으로 데이터 소스의 값을 비교하는

관련 문제