2014-01-22 4 views
0

나는 사용자 정의 셀이있는 테이블이 있습니다. 이 셀에는 셀에서 이동하려는 레이블이 있습니다 (조건이 참인 경우). 해당 셀의 cellForRowAtIndexPath 메소드가 두 번째로 호출 된 경우에만 레이블의 위치가 업데이트되는 이유는 무엇입니까?TableViewCell - 사용자 정의 셀 IOS - 내용

이것은 첫 번째 질문입니다. 다음

enter image description here enter image description here

번째 문제는이다 : 맞춤 셀 프로그래밍 방식의 이미지를 추가 이러한 관점에서, 도면을 포함한다. 테이블에 두 개의 섹션이있는 경우 테이블을 스크롤 한 후 첫 번째 섹션의 첫 번째 셀 이미지가 두 번째 섹션의 첫 번째 셀에 나타납니다. 왜?

코드를 사전에

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

NSString *idDettCal = @"cellaVotoCalciatore"; 
NSString *idRiepilogo = @"riepilogoCell"; 
NSString *idTotali = @"bonusTotaliCell"; 

//Dictionary per Titolari e Panchinari 
NSDictionary *calciatore = [[NSDictionary alloc] init]; 




if (indexPath.section == 0 || indexPath.section == 1) { 

    foaVotoCalciatoreCell *cell = (foaVotoCalciatoreCell *)[tableView dequeueReusableCellWithIdentifier:idDettCal]; 

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


    //TITOLARI 
    if (indexPath.section == 0) { 
     calciatore = [titolari objectAtIndex:indexPath.row]; 

    } 
    //PANCHINARI 
    else if (indexPath.section == 1) { 
     calciatore = [panchinari objectAtIndex:indexPath.row]; 
    } 

    NSString *calciatoreStr = 
    [NSString stringWithFormat:@"%@%@%@%@", 
    [calciatore objectForKey:@"CALCIATORE"], 
    @" (", 
    [[calciatore objectForKey:@"SQUADRA"] substringToIndex:3], 
    @")"]; 


    NSString *imgRuolo = 
    [NSString stringWithFormat:@"%@%@", 
    [calciatore objectForKey:@"RUOLO"], 
    @".jpg"]; 

    cell.ruolo.image = [UIImage imageNamed:imgRuolo]; 


    NSDictionary *dettaglioVoto = [[NSDictionary alloc] init]; 
    UIImageView *imageIcona; 

    CGFloat offset; 
    dettaglioVoto = [calciatore objectForKey:@"VOTO_STM"]; 



    offset = 0; 
    for (NSString *icona in dettaglioVoto) { 
     if ([icona isEqualToString: @"AMMONITO"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"amm.png"]]; 
     } 
     else if ([icona isEqualToString: @"GOL_FATTO"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"golfatto.png"]]; 
     } 
     else if ([icona isEqualToString: @"GOL_SUBITO"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"golsubito.png"]]; 
     } 
     else if ([icona isEqualToString: @"ENTRATO"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"entrato.png"]]; 
     } 
     else if ([icona isEqualToString: @"USCITO"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"uscito.png"]]; 
     } 
     else if ([icona isEqualToString: @"ESPULSO"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"esp.png"]]; 
     } 
     else if ([icona isEqualToString: @"ASSIST"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"assist.png"]]; 
     } 
     else if ([icona isEqualToString: @"ASSIST_FERMO"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"assistf.png"]]; 
     } 
     else if ([icona isEqualToString: @"RIGORE_SEGNATO"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"rigoresegnato.png"]]; 
     } 
     else if ([icona isEqualToString: @"RIGORE_SBAGLIATO"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"rigoresbagliato.png"]]; 
     } 
     else if ([icona isEqualToString: @"RIGORE_PARATO"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"rigoreparato.png"]]; 
     } 
     else if ([icona isEqualToString: @"AUTOGOL"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"autogol.png"]]; 
     } 
     else if ([icona isEqualToString: @"GOL_PARTITA"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"golvittoria.png"]]; 
     } 
     else if ([icona isEqualToString: @"GOL_PAREGGIO"]) { 
      imageIcona = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"golpareggio.png"]]; 
     } 

     imageIcona.frame = CGRectMake(offset, 0, imageIcona.frame.size.width, imageIcona.frame.size.height); 
     offset = imageIcona.frame.size.width + offset + 2; 
     [cell.iconeDettaglio addSubview: imageIcona]; 
    } 

    if (offset == 0) { 
     cell.calciatore.frame = CGRectMake(cell.calciatore.frame.origin.x, 14, cell.calciatore.frame.size.width, cell.calciatore.frame.size.height); 
     cell.iconeDettaglio.hidden = YES; 
    } 

    cell.calciatore.text = calciatoreStr; 
    cell.votoIniziale.text = [calciatore objectForKey:@"VOTO_PRNT"]; 
    cell.votoFinale.text = [calciatore objectForKey:@"VOTO_PRNT_TOT"]; 
    return cell; 

} 
//La giornata è calcolata. Sezione 2 = BONUS e TOTALI 
else if (variabiliGlobali.gioCalcolata && indexPath.section == 2) { 

    NSDictionary *totaliVal; 
    NSDictionary *totaliTip; 

    totaliVal = [logCalValore objectAtIndex:indexPath.row]; 
    totaliTip = [logCalTipo objectAtIndex:indexPath.row]; 

    foaBonusTotaliCell *cell = (foaBonusTotaliCell *)[tableView dequeueReusableCellWithIdentifier:idTotali]; 
    if (cell == nil) 
    { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:idTotali owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
    } 

    cell.tipoBonusLabel.text = totaliTip; 
    cell.totaleLabel.text = totaliVal; 

    return cell; 

} 

else { 
    NSDictionary *riepilogoVal; 
    NSDictionary *riepilogoTip; 

    riepilogoVal = [logForValore objectAtIndex:indexPath.row]; 
    riepilogoTip = [logForTipo objectAtIndex:indexPath.row]; 

    foaRiepilogoCell *cell = (foaRiepilogoCell *)[tableView dequeueReusableCellWithIdentifier:idRiepilogo]; 
    if (cell == nil) 
    { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:idRiepilogo owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
    } 

    cell.voceRiepilogoLabel.text = riepilogoTip; 
    cell.valoreRiepilogoLabel.text = riepilogoVal; 
    return cell; 
} 



} 

감사합니다.

+1

관련 코드를 게시해야 문제를 해결할 수 있습니다. – rmaddy

+0

코드를 게시했습니다 –

+0

이미지를 삽입했습니다. 첫 번째는 테이블이 나타날 때입니다. 두 번째는 두루마리 뒤에 있습니다. –

답변

0

첫 번째 질문 : 어떤 레이블입니까? 어떤 조건? 이 문제에 대해 이야기하고 있습니까?

if (offset == 0) { 
     cell.calciatore.frame = CGRectMake(cell.calciatore.frame.origin.x, 14, cell.calciatore.frame.size.width, cell.calciatore.frame.size.height); 
     cell.iconeDettaglio.hidden = YES; 
} 

여기에 더 자세히 설명해야합니다.

두 번째 질문 : 잘못된 이미지가 잘못된 세포에 표시하는 이유는 세포가 tableView에 의해 재사용되고 있다는 점이다. 재사용 할 때 사용자 정의 셀의 label.textimageView.imagedequeueReusableCellWithIdentifier: 바로 뒤에 nil으로 설정하여 비어 있는지 확인하십시오.

경고 :이되지수있는 좋은 아이디어 : 당신의 cell를 다시, 한 번 재사용되고 있기 때문에

[cell.iconeDettaglio addSubview: imageIcona]; 

, 이전 imageIcona를 참조하고로 위에 또 다른 imageIcona을 추가 할 것 subview. imageIconaIBOUTLET 또는 사용자 지정 셀의 속성으로 지정하고 image 변수 만 cellForRowAtIndexPath:으로 설정합니다.

+0

첫 번째 질문 : 레이블 아래의 이미지가 없으면 오프셋이 0이며 그래서 셀의 중간에 레이블을 이동하고 싶습니다. 레이블 "Buffon (JUV)"의 첫 번째 이미지에는 이미지가 없습니다. 표를 스크롤 한 후에 만 ​​레이블이 셀 가운데에서 이동하는 이유는 무엇입니까? 두 번째 질문에 대해서는 "cell.iconeDettaglio"보기에 추가 할 이미지 수를 모릅니다. 어떻게 IBOUTLET을 만들 수 있습니까? 내 IBOUTLET은 iconeDettaglio에 있습니다. –

+0

@MarcoGrieco : 코드에서 어디에서 그렇게하고 있는지 확실하지 않지만'[self.tableView setNeedsDisplay]'또는'[cell setNeedsDisplay]'를 호출 해보십시오. 이 중 아무 것도 작동하지 않으면'reloadRowsAtIndexPaths :'를'tableView'에서 호출하여 해당 셀을 다시로드 할 수 있습니다. – Armin

0

첫 번째 질문 : 나는 당신을 위해 디버깅 할 수 있지만, 코드를 실행하지 않고, 내가 코드의이 부분은

if (offset == 0) { 
    cell.calciatore.frame = CGRectMake(cell.calciatore.frame.origin.x, 14, cell.calciatore.frame.size.width, cell.calciatore.frame.size.height); 
    cell.iconeDettaglio.hidden = YES; 
} 

때문에이 다른 부분의 처음에 도달 결코 상상할 수 코드 offset = imageIcona.frame.size.width + offset + 2;.

dettaglioVoto이 비어 있기 때문에이 루프 for (NSString *icona in dettaglioVoto) {이 수행되지 않으므로 offset은 0과 동일하게 유지되고 원하는 방식으로 유지됩니다. 하지만 난 당신이 코드를 디버깅하지 않고도 if에 처음 도착하지 않는 이유를 알 수 없습니다.

두 번째 질문 : 나는 세포에 대한 재사용 메커니즘을 제대로 사용하지 않는다고 생각합니다.당신이 세포를 다시 사용하려고하는 경우에 따라서,이 같은 셀 코드에 prepareForReuse 방법을 설정 사용해야합니다

-(void) prepareForReuse { 
    // Your code code here: like clearing old images and text and/or setting new images or text 
} 

또한, 일반적으로 잘 작동하면 테이블 뷰의 펜촉을 등록하면,이 방법을 :

foaVotoCalciatoreCell *cell = (foaVotoCalciatoreCell *)[tableView dequeueReusableCellWithIdentifier:idDettCal]; 

if (cell == nil) 
{ 
    [[self tableView] registerNib:[UINib nibWithNibName:loadNibNamed:idDettCal bundle:nil] 
     forCellReuseIdentifier:nibWithNibName:loadNibNamed:idDettCal]; 
} 
+0

첫 번째 질문 : 레이블 아래의 이미지가 없으면 오프셋이 0이며 그래서 셀의 중간에 레이블을 이동하고 싶습니다. 레이블 "Buffon (JUV)"의 첫 번째 이미지에는 이미지가 없습니다. 표를 스크롤 한 후에 만 ​​레이블이 셀 가운데에서 이동하는 이유는 무엇입니까? –

관련 문제