2012-02-20 3 views
1

[table reloaddata]를 호출하면;셀을 다시 사용할 때 셀을 완전히 지우려면 어떻게합니까?

셀이 새 데이터로 다시 그려 지지만 UILabels가 이전 UILabels 위에 그려지기 때문에 엉망이되어 버립니다.

내 셀 초기화입니다.

나는 셀에 몇 가지 더 라벨, 같은 일이있다 그래서

 UILabel *theDateLabel = [[UILabel alloc] initWithFrame:CGRectMake(140, 35,140, 20)]; 
    [theDateLabel setBackgroundColor:[UIColor clearColor]]; 
    [theDateLabel setTextColor:[UIColor lightGrayColor]]; 
    [theDateLabel setText:[dateFormatter stringFromDate:theDate]]; 
    [theDateLabel setFont:[UIFont fontWithName:@"TrebuchetMS-Bold" size:15]]; 
    [cell addSubview:theDateLabel]; 
    [theDateLabel release]; 

같은 UILabel의를 추가합니다.

이전 레이블이 셀에서 사라져 더 이상 보이지 않게되고 싶습니다.

답변

10

cell의 하위보기로 theDateLabel을 추가하면 안됩니다. 하위보기를 cell.contentView으로 추가해야합니다.

yuji가 제시 하듯이 구현하는 방법 중 하나는 각 사용자 정의 하위 뷰에 대한 속성을 사용하여 UITableViewCell의 하위 클래스를 만드는 것입니다. 이렇게하면 재사용 된 셀의 날짜 레이블로 쉽게 이동하여 새 행의 텍스트를 설정할 수 있습니다.

또 다른 일반적인 접근 방식은 UIView에있는 tag 속성을 사용하는 것입니다. 예 :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString* PlaceholderCellIdentifier = @"PlaceholderCell"; 
    static const int DateLabelTag = 1; 

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier]; 
    if (!cell) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:PlaceholderCellIdentifier] autorelease]; 

     UILabel *theDateLabel = [[UILabel alloc] initWithFrame:CGRectMake(140, 35,140, 20)]; 
     theDateLabel.tag = DateLabelTag; 
     theDateLabel.backgroundColor = [UIColor clearColor]; 
     theDateLabel.textColor = [UIColor lightGrayColor]; 
     theDateLabel.font = [UIFont fontWithName:@"TrebuchetMS-Bold" size:15]; 
     [cell.contentView addSubview:theDateLabel]; 
     [theDateLabel release]; 
    } 

    NSDate *theDate = [self dateForRowAtIndexPath:indexPath]; 
    UILabel *theDateLabel = [cell.contentView viewWithTag:DateLabelTag]; 
    theDateLabel.text = [dateFormatter stringFromDate:theDate]; 

    return cell; 
} 
+0

+1은 간단하고 빠른 해결책입니다. 또한 셀뷰 자체가 아닌 contentView를 추천하는 것은 종종 잘못 수행되기 때문에 매우 귀중합니다 (tableView 편집 모드 등을 사용할 때 추악한 효과를 유발할 수 있습니다). – Till

5

리차드의 솔루션이 효과가 있지만 셀에 다른 하위보기가 있으면 제거 될 수도 있습니다. 또한 할당하고 셀을 그릴 때마다 하위보기를 초기화하는 반드시 최적은 아닙니다.

여기서 표준 솔루션은 UITableViewCell의 하위 클래스를 만들고 @dateLabel이라는 속성을 사용하는 것입니다 (다른 레이블의 경우도 마찬가지입니다). 그런 다음 셀을 초기화 할 때 @dateLabel이없는 경우 새 셀을 지정할 수 있습니다. 그렇지 않으면 텍스트를 설정하기 만하면됩니다.

+0

이것은 훌륭한 대답입니다. –

+0

내 대답, 좋은 생각보다 훨씬 더 나은 접근법! +1 –

관련 문제