2013-04-11 5 views
0

UITableView를 만들려고합니다. 그러나 내 테이블 오류가 스크롤되면 (셀이 숨겨지고 다시 표시 될 때) 탭을 재설정하고 서버에서 이미지를 다시로드합니다. 어떻게하면 이미지를로드하거나 (셀! = 전무) 다음 세포 자체를 반복하면 내가 배치하면 이전의 세포UITableViewCell 스크롤 후 자체 다시로드

static NSString *myIdentifier = @"myIdentifier"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier]; 
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:myIdentifier]; 


    backImage = [[UIImageView alloc] initWithFrame:CGRectMake(2, 4, 300, 62)]; 
    userDp = [[UIImageView alloc] initWithFrame:CGRectMake(11, 10, 50, 50)]; 
    name   = [[UILabel alloc] initWithFrame:CGRectMake(67, 12, 176, 20)]; 

    name.font   = [UIFont fontWithName:@"HelveticaLTStd-Bold" size:12]; 

CustomActivityViewer *imgIndicator = [[CustomActivityViewer alloc] initWithView:userDp]; 
[imgIndicator startAnimating]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
    UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", IMAGE_URL, player.imagePath]]]]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [imgIndicator stopAnimating]; 
     if (img != nil) 
      userDp.image = img; 

     [imgIndicator stopAnimating]; 
    }); 
}); 

[name setShadowColor:[UIColor blackColor]]; 
[name setShadowOffset:CGSizeMake(1, 1)]; 
name.textColor = [UIColor colorWithRed:1.0 green:0.824 blue:0 alpha:1.0]; 

cell.accessoryType = UITableViewCellAccessoryNone; 
[cell setSelectionStyle:UITableViewCellEditingStyleNone]; 
cell.backgroundColor = [UIColor clearColor]; 

[cell.contentView addSubview:backImage]; 
[cell.contentView addSubview:userDp]; 
[cell.contentView addSubview:name]; 

return cell;  

}

를 유지하지 할 수 있습니다.

어떻게해야합니까?

P.Si iPhone 자습서 중 하나에서 cell.contentView 태그로 항목을 설정 한 다음 셀이 0이 아닌 경우 태그가 포함 된보기를 다시 호출하는 것을 보았습니다. 그 튜토리얼을 찾지 못했습니다. 아무도 모른다면 그냥 넣으십시오.

+0

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableView_Class/Reference/Reference.html 'dequeueReusableCellWithIdentifier'에서 서버에서 이미지를 다시 가져 오는 이유는 사라진 테이블 뷰에서 셀을 재사용하고 있기 때문에 다시로드 될 때 이미로드 된 셀에 대한 코드를 실행할 때 UIImage * img = [UIImage imageWithData : [NSData dataWithContentsOfURL : [NSURL URLWithString : [NSString stringWithFormat : @ "% @/% @", IMAGE_URL, player.imagePath]]]]'다시 이미지를 가져옵니다. – Popeye

답변

1

매번 이미지를 다시로드하지 않으려면 이미지를 캐시하십시오. 옵션의 많은 도처에 있는데, 그 중 하나는 내가 하지이 추천 할 NSCache 또는 SDWebImage

+0

그게 아니라, 내가 원하는 걸. 내 표 셀을 다시 불러 오기를 원합니다. –

+0

iOS에서 새로운보기를 만드는 것은 광범위합니다. 그래서 우리는 재사용 기제 메커니즘을 사용하여, 우리는 약간의 세포 집합을 만듭니다. 새 셀이 표시되면 데이터로 채 웁니다. 따라서 SDWebImage를 사용하여 이미지를 한 번만 다운로드하여 필요할 때보기에 제공하십시오. –

+0

실제로 멋진 점이지만 그게 내 질문이 아닙니다. 내 tableView 셀이 보이지 않을 때 다시로드를 중지하고 자체를 볼 수 있습니다. –

1

입니다 :

할 수 있습니다 (하지만 안) 거기에 많은 개체와 세포의 자신의 배열을 만들 테이블에 행이 있기 때문입니다. 그런 다음 cellForRowAtIndexPath에서 재사용하지 않고 해당 셀을 반환 할 수 있습니다. 기술적으로 잘못된 것은 없습니다.

소수의 세포가 2 개있는 경우에는 정상이어야합니다. 그러나이 개념은 테이블이 커지면 메모리 문제로 이어질 것입니다.

(비동기 적으로로드 된) 이미지 배열을 유지하고 셀을 올바르게 다시 사용하고 cellForRowAtIndexPath 이미지 배열로 돌아갈 수 있습니다. 그러나 이것이 메모리 문제와 관련하여 많은 변화를 가져 오지는 않습니다. 셀 뷰와 하위 뷰 등의 메모리를 절약 할 수 있기 때문입니다. 그러나 일반적으로 이미지 데이터 자체는 메모리를 많이 소비합니다.

사용자 또는 비즈니스 데이터 등에 의존 할 수 있고 제한 될 수없는 불특정 다수의 행에 대해서는 더 똑똑한 캐싱 솔루션에 대한 대안이 없습니다.

+0

+1 잘 설명했다. – Popeye

관련 문제