2011-05-23 3 views
0

J'ai un problème. J'ai un Customable UITableViewCel, la cellule contient un curseur qui modifie une valeur sur une étiquette sur la cellule. En cliquant sur la cellule, puis déplacer la table, la valeur se reproduit sur une autre cellule, puis modifie la valeur à une autre cellule, la réinitialisation de sa valeur à 0.Personnalisation de TableViewCell en changeant des valeurs de manière aléatoire?

fins de démonstration:

premier réglage de la la valeur

enter image description here

en cliquant sur une cellule aléatoire retourne alors:

une cellule totalement différente avec le sam Les données qui n'ont pas été mises là.

enter image description here

Et puis au retour dans la cellule où la valeur a été la première série:

enter image description here

La valeur est à 0

Quelqu'un peut-il me aider:

Ma valeur de curseur a changé de code;

labelSliderVal.text = [NSString stringWithFormat:@"%1.0f", sliderSlider.value]; 
if(sliderSlider.value < 30) 
{ 
    self.backgroundColor = [UIColor redColor]; 
} 
else if(sliderSlider.value > 60) 
{ 
    self.backgroundColor = [UIColor greenColor]; 
} else { 
    self.backgroundColor = [UIColor blueColor]; 
} 

Et mes UITableViews didSelectRowAtIndexPath

en commentaire

/* 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Navigation logic may go here. Create and push another view controller. 
    /* 
    <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil]; 
    // ... 
    // Pass the selected object to the new view controller. 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
    [detailViewController release]; 

}*/ 

cellForRowAtIndexPath:

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

    static NSString *CellIdentifier = @"customCell"; 

    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     NSArray *nibObjs = [[NSBundle mainBundle] loadNibNamed:@"CustomCellView" owner:nil options:nil]; 
     //cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

     for(id currentObj in nibObjs) 
     { 
      if([currentObj isKindOfClass:[CustomCell class]]) 
      { 
       cell = (CustomCell *)currentObj; 
      } 

     } 
    } 

    GradeToolAppDelegate * appDelegate = [UIApplication sharedApplication].delegate; 
    Module *aModule = [appDelegate.modules4 objectAtIndex:indexPath.section]; 
    AssessmentDetail *anAssess = [aModule.assessmentDetails4 objectAtIndex:indexPath.row]; 

    cell.sliderSlider.tag = indexPath.row; 
    cell.labelAssessment.text = [NSString stringWithFormat:@"%@", anAssess.assessmentName4]; 
    cell.labelAssessmentType.text = [NSString stringWithFormat:@"%@", anAssess.assessmentType4]; 
    cell.labelWeighting.text = [NSString stringWithFormat:@"%@", anAssess.assessmentWeighting4]; 
    cell.labelDueDate.text = [NSString stringWithFormat:@"%@", anAssess.assessmentDueDate4]; 

    return cell; 
} 
+0

Cela ressemble à un problème de réutilisation de cellule. Il semble également que les cellules soient utilisées (ou essayent d'être utilisées) pour "maintenir" les données au lieu de simplement les afficher. Si vous publiez la méthode cellForRowAtIndexPath, les utilisateurs peuvent vous donner des conseils plus spécifiques. – Anna

Répondre

1

Initialisation

NSMutableArray *results = [[NSMutableArray alloc] init]; 

NSInteger numberOfSections = [myTableView numberOfSections]; 
for (int section = 0; section < numberOfSections ; section++) { 
    NSInteger  numberOfRows = [myTableView numberOfRowsInSection:section]; 
    NSMutableArray *sectionResults = [NSMutableArray array]; 

    [results addObject:sectionResults]; 

    for (int row = 0; row < numberOfRows; row++) { 
     [sectionResults addObject:[NSNumber numberWithFloat:0.0]]; 
    } 
} 

En tableView:cellForRowAtIndexPath:,

... 
NSArray *sectionResults = [results objectAtIndex:indexPath.section]; 
NSNumber *number = [sectionResults objectAtIndex:indexPath.row]; 

slider.value = [number floatValue]; 

... 

En sliderValueChanged:,

- (void)sliderValueChanged:(UISlider *)slider { 
    CustomCell *cell = (CustomCell *)slider.superview; 
    NSIndexPath *indexPath = [myTableView indexPathForCell:cell]; 
    NSArray *sectionResults = [results objectAtIndex:indexPath.section]; 

    ... 
    NSNumber *number = [NSNumber numberWithFloat:slider.value]; 
    cell.sliderValueLabel.text = [NSString stringWithFormat:@"%f", slider.value]; 

    [sectionResults replaceObjectAtIndex:indexPath.row withObject:number]; 
    ... 
} 

Code pour totalForSection:,

- (float) totalForSection:(NSInteger)sectionIndex { 
    NSArray *sectionResults = [results objectAtIndex:sectionIndex]; 
    float result = 0.0; 

    for (NSNumber *number in sectionResults) { 
     result += [number floatValue]; 
    } 

    return result; 
} 

- (float)sumTotal { 
    float result = 0.0; 
    NSinteger numberOfSections = [myTableView numberOfSections]; 
    for (int i = 0; i < numberOfSections; i++) { 
     result += [self totalForSection:i]; 
    } 

    return result; 
} 

initiale Réponse

Eh bien, cela se produit en raison de cellules réutilisables. Vous devrez stocker l'état du contenu et mettre à jour la cellule en conséquence dans tableView:cellForRowAtIndexPath:. Lors du changement de valeur du curseur,

- (void)sliderValueChanged:(UISlider *)slider { 
    CustomCell *cell = (CustomCell *)slider.superview; 
    NSIndexPath *indexPath = [myTableView indexPathForCell:cell]; 

    AssessmentDetail *anAssessment = [module.assessmentDetails4 objectAtIndex:indexPath.row]; 
    anAssessment.property = slider.value; 
    cell.propertyLabel.text = [NSString stringWithFormat:@"%f", slider.value]; 
} 

Maintenant, le modèle et l'étiquette ont été modifiés. Donc, la prochaine fois que la cellule est réutilisée, l'étiquette devrait avoir la bonne valeur.

+0

Merci pour cela, j'ai ajouté mon cellForRowAtIndexPath s'il y a quelque chose qui devrait être changé, je vais mettre à jour mon code pour refléter certaines modifications que vous avez faites –

+0

Quelle valeur varie en fonction du curseur? –

+0

La propriété value du curseur est uniquement utilisée, le curseur se déplace, met à jour une étiquette sur la cellule et c'est tout. –

Questions connexes