2014-09-09 2 views
0

UITableView에 배치 된 게시물이있는 앱이 있습니다. 각 게시물에는 좋아하는 버튼이있어서 사용자가 클릭 할 때 이미지를 변경해야합니다.업데이트 할 때 충돌이 발생합니다. iOS의 UITableViewCell 내의 UIButton 이미지

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *identifier = @"identifier"; 

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:identifier]; 

if(cell == nil){ 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"myNib" owner:self options:nil]; 
    cell = [nib objectAtIndex:0]; 
} 

NSDictionary *post = [posts objectAtIndex:indexPath.row]; 

[cell.likeButton addTarget:self 
       action:@selector(clickedOnLike:) 
     forControlEvents:UIControlEventTouchUpInside]; 
cell.likeButton.tag = indexPath.row; 

클릭 핸들러 : 여기에 코드입니다이 시점에서

-(IBAction)clickedOnLike:(id)sender 
{ 

int tag = buttonSender.tag; 
NSDictionary *post = [posts objectAtIndex:tag]; 

if(![self likedAlready:post]){ 

    //set liked on this view... 

    //update view 
    NSLog(@"button: %@",buttonSender); 
    [sender setImage:[UIImage imageNamed:@"newImage.png"] forState:UIControlStateNormal]; 

    //send like to server... 
    } 
} 

, 모든 것이 괜찮아 것입니다. 문제는 단추를 클릭하고보기를 업데이트하고 다른 셀로 스크롤 한 후 결코 클릭하지 않은 다른 단추보기도 업데이트된다는 것입니다. 예를 들어, indexPath 1의 버튼을 클릭하면 5와 9의 버튼이 자동으로 이미지를 변경합니다. 이것은 액션 발신자를 직접 호출하고 업데이트하기 때문에 나에게 미스터리입니다. 도와 주셔서 감사합니다.

+0

세포가 재사용되기 때문에 "addTarget"호출은 여전히 ​​남아 있습니다. (아마 그들은 쌓여있을 것입니다). 어쩌면 cellForRowAtIndexPath 시작 부분에서 제어 이벤트에 대한 작업을 제거해야합니다. – EDUsta

답변

1

재사용 가능한 셀 : dequeueReusableCellWithIdentifier.

U 이렇게 수동으로 처리해야합니다.

U는 (당신의 MVC 개발 아키텍처) 모달 내에서 유지하기 위해 CellForRowAtIndexPath:

시도에서 clickedOnLike: 방법을 수동으로 호출하고 문제를 해결할 것 CellForRowAtIndexPath:

에서이 액세스 할 수 있습니다 :

행운을 빌어 요!

1

cellForRowAtIndexPath에서 버튼의 기본 이미지를 설정하고 즐겨 찾기 인 경우 버튼을 변경하십시오. 행은 캐쉬되는 경향이 있으므로 항상 데이터를 예상대로 설정하십시오.

1

다른 사람들이 말했듯이 문제는보기가 영원히 재생 될 수 있고 재생 된 복사본에서 버튼의 그림이 새로운 것으로 변경되었을 수 있기 때문입니다. 메모리의 어딘가에 게시물의 상태를 유지하고 cellForRowAtIndexpath에 행이 렌더링 될 때마다 버튼의 올바른 이미지를 설정해야합니다. 당신이 게시물의 매우 작은 번호가있는 경우

또한, 단지

을 수행하여 재활용을 제거

정적있는 NSString * 식별자 = 무기 호;

관련 문제