在扩展多个部分时,扩展UITableView中的部分会崩溃

时间:2013-08-01 08:00:51

标签: iphone ios uitableview crash

尝试扩展UITableView中的部分,如果单个部分被展开并且关闭然后它就可以了,但是如果某个部分被展开,那么另一部分没有关闭之前就会崩溃。 以下是我正在尝试的代码。

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

UILabel *txtQues = [[UILabel alloc]initWithFrame:CGRectMake(5, 5, 310, 30)];
txtQues.backgroundColor = [UIColor clearColor];
txtQues.lineBreakMode = NSLineBreakByWordWrapping;
txtQues.numberOfLines = 2;
txtQues.userInteractionEnabled = FALSE;

UITextView *txtAns = [[UITextView alloc]initWithFrame:CGRectMake(5, 10, 310, 60)];
txtAns.backgroundColor = [UIColor clearColor];
txtAns.userInteractionEnabled = FALSE;

txtQues.font = [UIFont fontWithName:@"Helvetica-Bold" size:13.0];

if(!helpOn)
//if (indexPath.section==selectedCellIndexPath)
{
    if(indexPath.row == 0)
        [cell.contentView addSubview:txtQues];
        txtQues.text = [self.mArrQues objectAtIndex:indexPath.section];
}
else
{
    if(indexPath.row == 0)
    {
        [cell.contentView addSubview:txtQues];
        txtQues.text = [self.mArrQues objectAtIndex:indexPath.section];
    }
    else{
        [cell.contentView addSubview:txtAns];
        txtAns.text = [self.mArrAns objectAtIndex:indexPath.section];
    }
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;

return cell;
}

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

int ind = indexPath.section;
if(ind == selectedCellIndexPath)
{
}
else{
    helpOn = YES;
}
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];
    }
}
}

请指导以上我不知道我们出错了这里已经度过了一个晚上和一个早晨。在section方法中,它在行数上崩溃了。 下面是错误。

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

1 个答案:

答案 0 :(得分:1)

阅读错误消息并检查numberOfRowsInSectiondidSelectRowAtIndexPath中的逻辑。它说得很简单:

  

无效更新:第0节中的行数无效。更新后的现有部分中包含的行数(2)必须等于更新前该部分中包含的行数(1),或者减去从该部分插入或删除的行数(0插入,0删除)和加或减移入或移出该部分的行数(0移入,0移出)。'

很难比iOS已经更清楚地解释这一点。您可能正在重新加载表,然后该表抛出一个错误,指出第0部分(您的第一部分)中的行数在更新之间是不同的,并且不允许。检查确定更新表之前和之后第0部分中行数的逻辑。

<强> [编辑]

如果didSelectRowAtIndexPath:设置helpOn == YES,则selectedCellIndexPath = indexPath.section似乎如此。然后重新加载该部分的表,从而numberOfRowsInSectio:触发。在numberOfRowsInSection:如果helpOn == YESsection == selectedCellIndexPath返回2.这可能是您在更新前看到一个,在更新后看到2个的原因。

同样,我的建议是检查这两种方法的逻辑。更新后,您将更改其中一个部分中的行。

[编辑2]

旁注:您的cellForRowAtIndexPath每次都会分配一个新单元格。这是低效的。您的if(cell == nil) { // create new cell }不需要其他内容。