2013-05-07 2 views
0

내 앱의 설정보기를 만들고 해당보기에서 UITableView입니다. 내 필요를 충족시키기 위해 사용자 지정 셀을 만들고 있지만 문제가 있습니다 - 마지막 셀만이 [layoutSubviews]이됩니다. 내가 뭔가 잘못하고 있는거야? 맞춤 셀? 마지막 셀만 [layoutSubviews]를 가져옵니다?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    //int type = (indexPath.row == 0?1:0); 
    //if(indexPath.row == 6) type = 2; 

    NSLog(@"row %i created", indexPath.row); 
    TableCell *cell = [[TableCell alloc] initWithType:indexPath.row]; 

    cell.textLabel.text = @"Test cell"; 

    return cell; 
} 

그리고 내 사용자 지정 셀

:

@implementation TableCell 

UIImageView *shadowView; 
int row; 

- (id) initWithType:(int)type { 
    row = type; 

    self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; 

    self.backgroundColor = [UIColor clearColor]; 
    self.backgroundView = [[UIView alloc] init]; 

    UIImage *shadowImage = [UIImage imageNamed:@"CellShadow"]; 
    shadowImage = [shadowImage resizableImageWithCapInsets:UIEdgeInsetsMake(14, 14, 14, 14)]; 

    shadowView = [[UIImageView alloc] initWithImage:shadowImage]; 

    [self.contentView addSubview:shadowView]; 
    //[self.contentView sendSubviewToBack:shadowView]; 

    NSLog(@"agreed, row %i created", row); 

    [self layoutSubviews]; 

    return self; 
} 

- (void) layoutSubviews { 
    NSLog(@"row: %i", row); 

    [super layoutSubviews]; 

    shadowView.frame = CGRectMake(
     0, 0, 
     self.contentView.frame.size.width, 
     self.contentView.frame.size.height 
    ); 
} 

@end 

지속적으로, 마지막 셀 # 6, I는 회전하거나 layoutSubviews가 호출되어야 할 때 때보고됩니다. 어떤 제안?

답변

0

문제는 저의 가난한 코드 때문이었습니다. cell.backgroundView을 사용하면 많은 도움이되었습니다.

3

layoutSubviews으로 직접 전화하지 마세요. [self setNeedsLayout] 또는 [self layoutIfNeeded]을 사용하십시오. 그러나 셀의 init 메소드에서 이들을 호출하지 마십시오.

또한 [[TableCell alloc] initWithType : indexPath.row]를 호출하지 마십시오. 어느 쪽이든. 대신, ...

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath

당신은 당신이 그 값을 업데이트해야하므로 세포, 당신은, 그것의 행을 이야기하지만, 세포가 테이블 스크롤 할 때 재활용 얻을 것으로 인식 될 수 있음을 내장하면 cellForRowAtIndexPath에 대한 모든 전화.

테이블보기의 크기를 조정할 때 셀에서 레이아웃을 다시 가져와야합니다 (사용자가 직접 또는 간접 호출을하지 않아도 됨).

tableview doc here을 참조하십시오.

+0

자세한 답변 해 주셔서 감사합니다. 그러나 layoutSubviews에 대한 직접 호출이 아닌 [self setNeedsLayout]을 사용해도보기가 회전 될 때 마지막 행만 layoutSubviews를 가져옵니다. – mattsven

+0

코드를 더 자세히 읽어야합니다. (레이아웃 subviews 실수가 내 관심을 추월했다. 그 반드시 제거해야합니다). 나는 대답을 편집했다. 먼저 제대로 구축 된 셀을 가져 오면 레이아웃이 잘 작동합니다. 그렇지 않다면, 회전시 tableView reloadData를 시도하십시오. 그러나 필요하지 않습니다. – danh

+0

재사용 가능한 셀을 사용하고 있지 않습니다. 설정보기가 될 것이고 셀 수가 적기 때문입니다. 그리고 그것은 상관없이 작동하지 않는 것 같습니다. – mattsven

0

layoutSubviews을 직접 호출하면 안됩니다. 셀을 표시 할 준비가되면 iOS에서 자동으로 호출됩니다. @danh가 권장하는대로 셀을 deque해야합니다. 만약 당신이이 모든 것에 익숙하지 않다면, 실제로 이런 종류의 설정보기를 만드는 자동화 된 Sensible TableView 프레임 워크를 살펴볼 것을 권한다.

0

절대 레이아웃 서 브 뷰를 직접 호출하십시오. 셀의 서브 뷰 프레임이 변경 될 때 호출됩니다. 사용자 정의 셀의 레이블 텍스트를 변경하더라도 layoutSubviews를 호출하지 마십시오. 더 나은 성능을 위해 재사용 할 수있는 세포 deque. 매번 셀을 할당하지 않기 때문에. 그리고 할당 된 셀은 해제되지 않고 새로운 셀이 만들어지기 때문에 코드에서 많은 메모리 문제가있는 것처럼 보입니다.

+0

예, 할당 및 재사용을 허용하고 문제를 해결 한 이후 많은 변경 작업을 수행했습니다. 메모 주셔서 감사합니다! – mattsven

관련 문제