0

尝试在 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).'
4

1 回答 1

1

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

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

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

[编辑]

didSelectRowAtIndexPath:如果helpOn == YES你设置它看起来像那样selectedCellIndexPath = indexPath.section。然后您重新加载该部分的表,因此numberOfRowsInSectio: 触发。在numberOfRowsInSection:ifhelpOn == YES和 the 中,section == selectedCellIndexPath您返回 2。这可能就是您在更新前看到一个,而在更新后看到 2 个的原因。

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

[编辑 2]

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

于 2013-08-01T19:00:30.907 回答