展开部分UITableview在reloadSections时崩溃

时间:2013-07-31 13:38:30

标签: iphone ios

尝试扩展部分时,每个部分在展开时将有两行。它正在崩溃。以下是我正在尝试的代码。

-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
{
return [self.mArrQues count];
}

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if(!helpOn)
    return 1;
else
    if(section == selectedCellIndexPath)
    {
    return 2;
    }
    else{
        return 1;
    }
return 1;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"CellIdentifier";
UITableViewCell *cell;
cell = [self.mHelpTable dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
else{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

UIView* myBackgroundView = [[UIView alloc] initWithFrame:CGRectZero];
myBackgroundView.backgroundColor = [UIColor colorWithRed:240.0/255.0 green:240.0/255.0 blue:240.0/255.0 alpha:1.0];
cell.backgroundView = myBackgroundView;
//[cell addSubview:myBackgroundView];

if(!helpOn)
{
    cell.textLabel.text = [self.mArrQues objectAtIndex:indexPath.section];
}
else
{
if(indexPath.row == 0)
    {
    cell.textLabel.text = [self.mArrQues objectAtIndex:indexPath.section];
    }
else{
    cell.textLabel.text = [self.mArrAns objectAtIndex:indexPath.section];
    }
}

cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
helpOn = !helpOn;

int ind = indexPath.section;
if(ind == selectedCellIndexPath)
{
}
else{
    helpOn = 1;
}
if(helpOn)
{
    selectedCellIndexPath = indexPath.section;
[self.mHelpTable reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade];
}
else
{
    if(indexPath.row == 0)
    {
    //selectedCellIndexPath = indexPath.section;
    [self.mHelpTable reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade];
    }
}
}

错误:

Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (2) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

2 个答案:

答案 0 :(得分:1)

从代码中删除它。

else{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

如果单元格为零,则无需分配您的单元格,tableview将从此行中的上一个单元格重用

cell = [self.mHelpTable dequeueReusableCellWithIdentifier:cellIdentifier];  

AND

制作.h

int selectedCellIndexPath;
BOOL selected;

in .m

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{    
    if (section==selectedCellIndexPath)
    {
        //selected > this is because initialy selectedCellIndexPath is 0 and section is also 0
        if (selected) {
        return 2;
        }
        else{
            return 1;
        }
    }
    else{
        return 1;
    }
    return 1;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"CellIdentifier";
    UITableViewCell *cell;
    cell = [self.mHelpTable dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

    UIView* myBackgroundView = [[UIView alloc] initWithFrame:CGRectZero];
    myBackgroundView.backgroundColor = [UIColor colorWithRed:240.0/255.0 green:240.0/255.0 blue:240.0/255.0 alpha:1.0];
    cell.backgroundView = myBackgroundView;
    //[cell addSubview:myBackgroundView];

    //if(!helpOn)
    if (indexPath.section!=selectedCellIndexPath)
    {
        cell.textLabel.text = [mArrQues objectAtIndex:indexPath.section];
    }
    else
    {
        if(indexPath.row == 0)
        {
            cell.textLabel.text = [mArrQues objectAtIndex:indexPath.section];
        }
        else{
            cell.textLabel.text = [mArrAns objectAtIndex:indexPath.section];
        }
    }

    //cell.textLabel.text = [self.mArrQues objectAtIndex:indexPath.section];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    selected= !selected;
    selectedCellIndexPath = indexPath.section;
    //selectedCellIndexPath = indexPath.row;
    [self.mHelpTable reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade];

}

答案 1 :(得分:1)

当您更改部分的单元格数时,需要使用beginUpdatesendUpdates包装重新加载操作,并使用insertRowsAtIndexPaths:withRowAnimation和{指定单元格的插入和删除{1}}。

或者您可以使用'reloadData`重新加载所有单元格,但是如果您使用动画或用户体验,则会出现问题。