1

Trying to expand the sections each section will have two rows when expanded. It is giving crash. Below is code am trying.

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

Error :

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).'

4

2 回答 2

2

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

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

于 2013-07-31T13:56:18.830 回答
1

从您的代码中删除它。

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

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

cell = [self.mHelpTable dequeueReusableCellWithIdentifier:cellIdentifier];  

制作.h

int selectedCellIndexPath;
BOOL selected;

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

}
于 2013-07-31T13:50:00.370 回答