2013-02-24 2 views
4

간단한 UITableView를 화면에 추가했습니다. 그러나 그 안에있는 셀에 사용자 정의 UI 요소 (주로보기 및 레이블)를 표시하고 싶습니다. UITableViewCell은 자유롭게 커스터마이징 할 수있는 기회를 많이주지 않기 때문에 필요한 모든 요소를 ​​셀의 하위 뷰로 추가하기로했습니다. 여기 내 cellForRowAtIndexPath 메서드가 있습니다 :서브 뷰가있는 UITableViewCell이 재사용되지 않음

- (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]; 
} 

UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(10.0f, 10.0f, 25.0f, 25.0f)]; 
view1.backgroundColor = [UIColor redColor]; 
view1.layer.shadowColor = [[UIColor blackColor] CGColor]; 
view1.layer.shadowOffset = CGSizeMake(0.0f, 0.0f); 
view1.layer.shadowOpacity = 0.8f; 
view1.layer.shadowRadius = 3.0f; 
[cell addSubview:view1]; 

UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(85.0f, 5.0f, 100.0f, 15.0f)]; 
label1.text = @"dummy text 1"; 
label1.backgroundColor = [UIColor clearColor]; 
label1.textColor = [UIColor lightGrayColor]; 
label1.textAlignment = UITextAlignmentRight; 
label1.font = [UIFont systemFontOfSize:12.0f]; 
label1.lineBreakMode = NSLineBreakByTruncatingTail; 
label1.shadowOffset = CGSizeMake(0.0f, 1.0f); 
label1.shadowColor = [UIColor blackColor]; 
[cell addSubview:label1]; 

UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(85.0f, 25.0f, 100.0f, 15.0f)]; 
label2.text = @"dummy text 2"; 
label2.backgroundColor = [UIColor clearColor]; 
label2.textColor = [UIColor lightGrayColor]; 
label2.textAlignment = UITextAlignmentRight; 
label2.font = [UIFont systemFontOfSize:12.0f]; 
label2.lineBreakMode = NSLineBreakByTruncatingTail; 
label2.shadowOffset = CGSizeMake(0.0f, 1.0f); 
label2.shadowColor = [UIColor blackColor]; 
[cell addSubview:label2]; 

UILabel *label3 = [[UILabel alloc] initWithFrame:CGRectMake(85.0f, 45.0f, 100.0f, 15.0f)]; 
label3.text = @"dummy text 3"; 
label3.backgroundColor = [UIColor clearColor]; 
label3.textColor = [UIColor lightGrayColor]; 
label3.textAlignment = UITextAlignmentRight; 
label3.font = [UIFont systemFontOfSize:12.0f]; 
label3.lineBreakMode = NSLineBreakByTruncatingTail; 
label3.shadowOffset = CGSizeMake(0.0f, 1.0f); 
label3.shadowColor = [UIColor blackColor]; 
[cell addSubview:label3]; 

return cell; 
} 

위의 코드는 셀 사용자 정의가가는 한 작동합니다. 문제는 셀이 가시 영역을 벗어나면 서브 뷰가 해제되지 않는다는 것입니다. 내가 테이블 뷰를 위아래로 움직이면, 추가 된 UIView의 그림자가 더 어둡고 어두워지고 레이블이 해제되지 않는다고 추측합니다.

이 문제를 어떻게 해결합니까? UITableViewCell 클래스를 서브 클래스로 만들 수 있다고 생각하지만, 셀의 클래스 내에 서브 뷰를 추가하고 싶습니다. 그것은 해결책으로 보이지 않습니다. 셀이 사라지면 셀 뷰를 하위 뷰로 만들거나 셀을 실제로 자유롭게 사용자 정의 할 수있는 확실한 방법이 있습니까?

감사합니다.

몇 가지 추가 정보 : 나는 IB를 사용하지 않는 내가 엑스 코드 4.6 내 SDK가

+1

UITableViewCell ** 서브 클래 싱은 ** 해결책입니다. 당신이 지금하고있는 방식은 뷰와 라벨을 심지어 필요로하지 않는 셀에 추가 할 것입니다. –

답변

2

두 가지 방법으로 코드를 작동시킬 수 있습니다.

정확도은을 서브 클래 싱하여 추가 된 뷰를 속성으로 표시하는 입니다.

잘못된 방법은 다음과 같이 코드를 수정하는 것입니다 :

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

for (UIView *cellView in sell.view) 
{ 
    [cellView removeFromSuperVuew]; 
} 

당신은 그림자가 어둡고 어두워지고 너 자신을 알 수 있습니다. 이는 셀을로드 할 때마다뿐만 아니라 셀을 만들 때마다 추가됩니다 (모든 다른 하위 뷰 중에서).

당신이 imlement하는 것을 잊지 마세요 sublass하기로 결정

:

- (NSString *)reuseIdentifier 
{ 
    return @"hereGoesTeuseIdentifierThatYouWillUseForThissKindOfCell"; 
} 
+1

서브 클래 싱이 결국 작동했습니다. 가장 정확한 설명을했기 때문에 당신을 정답으로 선택했습니다. 그러나 kudos는 Odrakir과 Rick van der Linde linde에게도 빠릅니다. 고마워요! –

+0

그는 ARC를 사용하고 있습니다. ARC와 autorelease는 같은 조합으로 갈 수 없습니다. –

2

당신은있는 UITableViewCell 하위 클래스를 생성하고 모든 사용자 정의를해야 아이폰 OS 6.1 사용 ARC 를 사용 를 (프로그램 모든 것을 할) 그곳에.

+0

좋아요, 서브 클래 싱을 시도하겠습니다. –

2

문제는 세포가 재생되는 것입니다. 그것에 대해 생각해보십시오. 셀을 초기화하거나 재사용 할 때마다 모든 UIView를 셀에 연결했습니다. 단순히 괄호를 움직이면 초기화시에만보기가 첨부됩니다. 말했다 ... 콘텐츠를 추가하여 그 세포 흥미로운 확인하려면, 당신은 셀에서 그들에게 각 시간을 제거하거나 세포의 파단에 대한 참조를 유지해야합니다

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

     UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(10.0f, 10.0f, 25.0f, 25.0f)]; 
     view1.backgroundColor = [UIColor redColor]; 
     view1.layer.shadowColor = [[UIColor blackColor] CGColor]; 
     view1.layer.shadowOffset = CGSizeMake(0.0f, 0.0f); 
     view1.layer.shadowOpacity = 0.8f; 
     view1.layer.shadowRadius = 3.0f; 
     [cell addSubview:view1]; 

     UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(85.0f, 5.0f, 100.0f, 15.0f)]; 
     label1.text = @"dummy text 1"; 
     label1.backgroundColor = [UIColor clearColor]; 
     label1.textColor = [UIColor lightGrayColor]; 
     label1.textAlignment = UITextAlignmentRight; 
     label1.font = [UIFont systemFontOfSize:12.0f]; 
     label1.lineBreakMode = NSLineBreakByTruncatingTail; 
     label1.shadowOffset = CGSizeMake(0.0f, 1.0f); 
     label1.shadowColor = [UIColor blackColor]; 
     [cell addSubview:label1]; 

     UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(85.0f, 25.0f, 100.0f, 15.0f)]; 
     label2.text = @"dummy text 2"; 
     label2.backgroundColor = [UIColor clearColor]; 
     label2.textColor = [UIColor lightGrayColor]; 
     label2.textAlignment = UITextAlignmentRight; 
     label2.font = [UIFont systemFontOfSize:12.0f]; 
     label2.lineBreakMode = NSLineBreakByTruncatingTail; 
     label2.shadowOffset = CGSizeMake(0.0f, 1.0f); 
     label2.shadowColor = [UIColor blackColor]; 
     [cell addSubview:label2]; 

     UILabel *label3 = [[UILabel alloc] initWithFrame:CGRectMake(85.0f, 45.0f, 100.0f, 15.0f)]; 
     label3.text = @"dummy text 3"; 
     label3.backgroundColor = [UIColor clearColor]; 
     label3.textColor = [UIColor lightGrayColor]; 
     label3.textAlignment = UITextAlignmentRight; 
     label3.font = [UIFont systemFontOfSize:12.0f]; 
     label3.lineBreakMode = NSLineBreakByTruncatingTail; 
     label3.shadowOffset = CGSizeMake(0.0f, 1.0f); 
     label3.shadowColor = [UIColor blackColor]; 
     [cell addSubview:label3]; 
    } 

    return cell; 
} 

. 마지막 포인트, 도움이 될 수만 있다면 모든 뷰를 제거하지 마십시오. 값이 단순히 변경되면 UITableViewCell의 하위 클래스를 만들고 고유 한 값을 설정하는 고유 한 사용자 정의 클래스를 만듭니다.

+1

포스터는 ARC를 사용하고 있으며 'autorelease'에 대한 호출이 허용되지 않는다는 것을 질문에서 나타냅니다. –

+0

우수한 점. 게시물에 추가 메모를 놓쳤습니다. –

관련 문제