2012-01-25 6 views
0

J'ai personnalisé la cellule avec quatre étiquettes, initialement cela semble bien, mais lorsque je fais défiler et que je sélectionne une cellule, les étiquettes d'une autre rangée se chevauchent. voici mon code. Toute aide sera grandement appréciée.étiquettes dans les chevauchements de cellules personnalisées

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
static NSString *[email protected]"CellIdentifier"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; 

if (cell == nil) { cell = [[[UITableViewCell alloc] 
          initWithStyle:UITableViewCellStyleDefault 
          reuseIdentifier: CellIdentifier] autorelease]; 
} 
NSString *cellIconName = [[self cellIcon] objectAtIndex:[indexPath row]]; 
cellImage=[UIImage imageNamed:cellIconName]; 

cell.imageView.image=cellImage; 

UILabel *labelOne = [[UILabel alloc]initWithFrame:CGRectMake(65, 10, 140, 20)]; 
labelOne.text = [[NSString alloc]initWithFormat:@"%@",[dataList objectAtIndex:indexPath.row]]; 
[cell.contentView addSubview:labelOne]; 
[labelOne release]; 

UILabel *labelTwo = [[UILabel alloc]initWithFrame:CGRectMake(260, 10, 140, 20)]; 
labelTwo.text = [[NSString alloc]initWithFormat:@"%@",[newPrice objectAtIndex:indexPath.row]]; 
[cell.contentView addSubview:labelTwo]; 
[labelTwo release]; 



UILabel *label3 = [[UILabel alloc]initWithFrame:CGRectMake(65, 30, 140, 20)]; 
label3.text=[[NSString alloc]initWithFormat:@"%@",[details objectAtIndex:indexPath.row]]; 
[cell.contentView addSubview:label3]; 
[label3 release]; 


UILabel *label4 = [[UILabel alloc]initWithFrame:CGRectMake(260, 30, 140, 20)]; 
label4.text=[[NSString alloc]initWithFormat:@"%@",[oldPrice objectAtIndex:indexPath.row]]; 
[cell.contentView addSubview:label4]; 
[label4 release]; 

return cell; 

}

Répondre

4

L'erreur est vous avez attribué les étiquettes dans (une partie autre) en dehors de la condition if if(cell==nil). Vous ne devez créer les étiquettes qu'une seule fois, lors de la création de la cellule.

Lorsque nous exécutons le code, le contrôle vérifie si la cellule est nulle ou si elle contient des valeurs. Si nous allouons l'étiquette dans la partie else à chaque fois (tout en faisant défiler aussi), vous créez une nouvelle étiquette à chaque fois. Si nous l'allouons en condition if, l'étiquette n'est allouée qu'une seule fois pour chaque cellule et nous mettons juste à jour la valeur du texte lors du défilement.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *[email protected]"CellIdentifier"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; 

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

NSString *cellIconName = [[self cellIcon] objectAtIndex:[indexPath row]]; 
cellImage=[UIImage imageNamed:cellIconName]; 

cell.imageView.image=cellImage; 

UILabel *labelOne = [[UILabel alloc]initWithFrame:CGRectMake(65, 10, 140, 20)]; 
labelOne.tag = 100; 
[cell.contentView addSubview:labelOne]; 
[labelOne release]; 

UILabel *labelTwo = [[UILabel alloc]initWithFrame:CGRectMake(260, 10, 140, 20)]; 
labelTwo.tag = 101; 
[cell.contentView addSubview:labelTwo]; 
[labelTwo release]; 

} 

UILabel *labelOne = (UILabel *) [cell.contentView viewWithTag:100]; 
labelOne.text = [dataList objectAtIndex:indexPath.row]; 

UILabel *labelTwo = (UILabel *) [cell.contentView viewWithTag:101]; 
labelTwo.text = [newPrice objectAtIndex:indexPath.row]; 
  

return cell; 
} 
+0

Pouvez-vous expliquer pourquoi ce code est mieux que le code dans la question, ce serait rendre cette réponse digne d'un upvote. – jrturton

+0

cela fonctionne ... pourriez-vous s'il vous plaît expliquer ce qui ne va pas avec mon code? – NoviceDeveloper

+1

M.NoviceDeveloper et M.Jrturton. L'erreur est que vous avez alloué les étiquettes dans (else part) en dehors de la condition if si (cell == nil) '. Lorsque nous exécutons le code, le contrôle vérifie si la cellule est nulle ou possède des valeurs. Si nous allouons l'étiquette dans la partie else à chaque fois (en faisant défiler aussi), l'étiquette est en train d'allouer et récupère les valeurs d'un tableau. Si nous l'allouons en condition if, seulement une fois que le label est alloué pour chaque cellule et récupère les valeurs d'un tableau. Désolé pour mon mauvais anglais. C'est clair? Merci. –

1

Vous pouvez également essayer cet extrait de code suivant après

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

for (UIView * subView in [cell.contentView subviews]) 
{ 
[subView removeFromSuperView]; 
} 

espère que ce sera vous aider :)

Questions connexes