尝试重新加载部分

时间:2015-11-19 08:10:09

标签: ios objective-c iphone uitableview expand

我正在使用TQMultistageTableView库创建一个基于表的应用程序来扩展部分。我的要求是,如果用户将点击表格部分,则部分背景颜色应更改为蓝色,如果未选择/展开,则休息部分背景颜色应为白色。为此,我创建了一个数组来保存段索引,然后我正在重新加载这一部分。

第一次(当我的数组为零时),它的工作正常。但问题是当我的数组中保存了一个部分索引时(因为任何一个部分被展开/选中)然后我试图通过重新加载第二部分来扩展其他部分,那时它崩溃了以下错误:

  

***断言失败 - [UITableView _endCellAnimationsWithContext:],/ SourceCache / UIKit_Sim / UIKit-2935.137 / UITableView.m:1368

     

***由于未捕获的异常'NSInternalInconsistencyException'而终止应用,原因:'无效更新:无效   第1节中的行数。包含在中的行数   更新后的现有部分(0)必须等于数量   更新前的该部分中包含的行(3),加号或减号   从该部分插入或删除的行数(插入0,   删除0)加上或减去移入或移出的行数   该部分(0移入,0移出)。'

这是我的代码:

//标题打开方法

- (void)mTableView:(TQMultistageTableView *)mTableView1 willOpenHeaderAtSection:(NSInteger)section
{
    NSLog(@"Open Header ----%ld",section);
    NSDictionary *selectedSection = [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%ld", (long)section] ,@"section" ,nil];

    for(int i=0;i<[ selectedArrayForSectionPlus count];i++)
    {
        if([[[selectedArrayForSectionPlus objectAtIndex:i] objectForKey:@"section"] isEqualToString:[NSString stringWithFormat:@"%ld", (long)section]])
        {
            [selectedArrayForSectionPlus removeObjectAtIndex:i];
            [self.mTableView.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade];

            return;
        }
    }

    [selectedArrayForSectionPlus addObject:selectedSection];

    [self.mTableView.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade];//here it is crashing
}

//标题关闭方法

- (void)mTableView:(TQMultistageTableView *)mTableView willCloseHeaderAtSection:(NSInteger)section
{    
    NSLog(@"Close Header ---%ld",section);

    for(int i=0;i<[ selectedArrayForSectionPlus count];i++)
    {
        if([[[selectedArrayForSectionPlus objectAtIndex:i] objectForKey:@"section"] isEqualToString:[NSString stringWithFormat:@"%ld", (long)section]])
        {
            [selectedArrayForSectionPlus removeObjectAtIndex:i];
            [self.mTableView.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade];

            return;
        }
    }
}

// viewForHeaderInSection方法

- (UIView *)mTableView:(TQMultistageTableView *)mTableView viewForHeaderInSection:(NSInteger)section;
{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.mTableView.frame.size.width, 80)];

    for (int i = 0; i<selectedArrayForSectionPlus.count; i++) {
        if([[[selectedArrayForSectionPlus objectAtIndex:i] objectForKey:@"section"] isEqualToString:[NSString stringWithFormat:@"%ld", (long)section]])
        {

            [view setBackgroundColor:[UIColor colorWithRed:0/255.0 green:150/255.0 blue:214/255.0 alpha:1.0]];

        }
        else
        {
            [view setBackgroundColor:[UIColor whiteColor]];
        }
    }

    return view;
}

有没有人知道如何重新加载该部分?

感谢您的任何指示!

4 个答案:

答案 0 :(得分:2)

当您重新加载特定部分时,其他部分数据源(您的数据数组)应与以前相同。

我认为您在重新加载部分调用之前正在更新数据源。

这是您的问题

您没有重新加载第1部分,而是重新加载其他部分。在重新加载数据源(数据数组)之前,第1部分包含三行(记录),但是当您重新加载该部分时,由于某种原因,您的数据源(数据数组索引1)将更改为0行(记录)。数据源(数据数组)的索引1应包含三行。

填充时检查数据源,并在更新前后进行比较。

答案 1 :(得分:1)

将您的部分重新加载调用封装在beginUpdatesendUpdates这样的内容中:

[self.mTableView.tableView beginUpdates];
[selectedArrayForSectionPlus removeObjectAtIndex:i];
[self.mTableView.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade];
[self.mTableView.tableView endUpdates];

编辑:与OP进行讨论。

  1. 点按第1部分的电话willOpenHeaderAtSection。在此处跟踪点击的部分。
  2. 点击第2部分的电话willCloseHeaderAtSection。将该部分与#1中的跟踪部分进行匹配。如果匹配,请执行willCloseHeaderAtSection代码并重置跟踪部分。如果不匹配则只返回而不执行您的代码。

答案 2 :(得分:0)

这是你的问题:

Group A
.......
abc : 100
xyz  :200

Group B
.......
abc : 200
xyz  :200
axd  :100
..........

Summary
abc  :300
xyz  :400
axd  :100

所以在使用此行之前添加[self.mTableView.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade];

因为有一个标题和表格视图,如果你要更新任何一个,我应该有问题。

如果您的问题在上述问题上得到解决,那就很好....

答案 3 :(得分:0)

当你打开第1节标题时我有同样的问题并在打开标题时更新标题在不同的部分它用于抛出错误所以这里是我做的工作它没关系 用于更新标题的代码

[self.mTableView.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade];

并且只需要做的一件事就是在TQMultistageTableView.m文件中方法名称 - (void)openOrCloseHeaderWithSection:(NSInteger)部分 只需粘贴代码并完成

  [self.tableView beginUpdates];
NSMutableArray *deleteIndexPaths = [[NSMutableArray alloc] init];
NSMutableArray *insertIndexPaths = [[NSMutableArray alloc] init];

NSInteger oldSection = self.openedIndexPath.section;
NSInteger newSection = section;

if (oldSection <= -1)
{

    if (oldSection != newSection)
    {
        insertIndexPaths = [self buildInsertRowWithSection:newSection];
    }
}
else
{

    if (oldSection != newSection && newSection > -1)
    {

        deleteIndexPaths = [self buildDeleteRowWithSection:oldSection];
        insertIndexPaths = [self buildInsertRowWithSection:newSection];
    }
    else
    {
         deleteIndexPaths = [self buildDeleteRowWithSection:oldSection];
    }
}


if ([deleteIndexPaths count] > 0)
{
    [self.tableView deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation:UITableViewRowAnimationFade];
}
if ([insertIndexPaths count] > 0)
{
    [self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationLeft];
}

[self.tableView endUpdates];