Пользовательский TableViewCell меняет значения случайно? - PullRequest
0 голосов
/ 23 мая 2011

У меня проблема. У меня есть Custom UITableViewCel, ячейка содержит ползунок, который изменяет значение на метке в ячейке. Если щелкнуть ячейку, а затем переместить таблицу, значение реплицируется в другую ячейку, а затем изменяется на другую ячейку, сбрасывая ее значение на 0.

Для демонстрационных целей:

Первая установка значения

enter image description here

Щелчок по случайной ячейке, затем возвращает:

Абсолютно другая ячейка с теми же данными, которых там не было.

enter image description here

А затем при возврате обратно в ячейку, где было впервые установлено значение:

enter image description here

Значение возвращается к 0

Может кто-нибудь помочь мне здесь:

Значение My Slider изменило код;

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];
}

И мои UITableViews didSelectRowAtIndexPath

Закомментировано

/*
- (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;
}

1 Ответ

1 голос
/ 23 мая 2011

Инициализация

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]];
    }
}

В tableView:cellForRowAtIndexPath:,

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

slider.value = [number floatValue];

...

В 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];
    ...
}

Код для 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;
}

Начальный ответ

Ну, это происходит из-за многоразовых ячеек.Вам нужно будет сохранить состояние содержимого и соответственно обновить ячейку в tableView:cellForRowAtIndexPath:.При изменении значения ползунка

- (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];
}

Теперь и модель, и метка были изменены.Поэтому при следующем повторном использовании ячейки метка должна получить правильное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...