2013-03-20 82 views
0

我面临一个关于可扩展tableviewcell的问题。它崩溃时,我尝试扩大tableviewcell。 我不明白应用程序崩溃的位置。请给我一些解决方案。 请帮帮我。UITableViewCell可扩展崩溃

我的代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    if (appDelegate.array_proj == (id)[NSNull null]) 
     return 0; 
    else 
     return [appDelegate.array_proj count]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 

    if ([expandedSections containsIndex:section]) 
    { 
     if ([appDelegate.array_task count]==0) 
     { 
      return 0; 
     } 
     else 
     { 
      NSLog(@"array task count: %d",[appDelegate.array_task count]); 
      return [appDelegate.array_task count]; 
     } 
    } 
    return 1; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell ==nil){ 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.backgroundColor = [UIColor clearColor]; 
    cell.textLabel.textColor = [UIColor colorWithRed:53.0/255 green:53.0/255 blue:53.0/255 alpha:1.0]; 

    UIImageView *backgroundView = [[UIImageView alloc] initWithFrame:CGRectZero]; 
    cell.backgroundView = backgroundView; 
    backgroundView.image = [UIImage imageNamed:@"prjctcell_bg.png"]; 

    if (!indexPath.row) 
    { 
     objePro = [appDelegate.array_proj objectAtIndex:indexPath.section]; 

     cell.textLabel.text = objePro.projctname; 
     appDelegate.intForPid=objePro.pojctid; 

     if ([expandedSections containsIndex:indexPath.section]) 
     { 
      cell.accessoryView = [DTCustomColoredAccessory accessoryWithColor:[UIColor blackColor] type:DTCustomColoredAccessoryTypeUp]; 
     } 
     else 
     { 
      cell.accessoryView = [DTCustomColoredAccessory accessoryWithColor:[UIColor blackColor] type:DTCustomColoredAccessoryTypeDown]; 
     } 
    } 
    else 
    { 
     if (appDelegate.array_task != (id)[NSNull null]) 
     { 
      objePro = [appDelegate.array_proj objectAtIndex:appDelegate.storeAppDelegateIndex]; 
      objeTask = [appDelegate.array_task objectAtIndex:indexPath.section]; 

      cell.textLabel.text = objeTask.taskname; 
      cell.backgroundView = nil; 
      cell.accessoryView = nil; 
      cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
     } 
    } 
    return cell; 
} 

- (BOOL)tableView:(UITableView *)tableView canCollapseSection:(NSInteger)section 
{ 
    return YES; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    objePro = [appDelegate.array_proj objectAtIndex:indexPath.section]; 
    appDelegate.intForPid=objePro.pojctid; 

    [appDelegate selectTask:appDelegate.intForPid]; 

    if (!indexPath.row) 
    { 
     [tblView beginUpdates]; 

     //only first row toggles expand/collapse 
     [tblView deselectRowAtIndexPath:indexPath animated:YES]; 

     NSInteger sections = indexPath.section; 
     BOOL currentlyExpanded = [expandedSections containsIndex:sections]; 
     NSInteger rows; 

     NSMutableArray *tmpArray = [NSMutableArray array]; 
     if (currentlyExpanded) 
     { 
      rows = [self tableView:tblView numberOfRowsInSection:sections]; 
      [expandedSections removeIndex:sections]; 
     } 
     else 
     { 
      [expandedSections addIndex:sections]; 
      rows = [self tableView:tblView numberOfRowsInSection:sections]; 
     } 
     for (int i=1; i<rows; i++) 
     { 
      NSIndexPath *tmpIndexPath = [NSIndexPath indexPathForRow:i inSection:sections]; 
      [tmpArray addObject:tmpIndexPath]; 
     } 
     UITableViewCell *cell = [tblView cellForRowAtIndexPath:indexPath]; 

     if (currentlyExpanded) 
     { 

      [tblView deleteRowsAtIndexPaths:tmpArray withRowAnimation:UITableViewRowAnimationTop]; 
      cell.accessoryView = [DTCustomColoredAccessory accessoryWithColor:[UIColor blackColor] type:DTCustomColoredAccessoryTypeDown]; 
     } 
     else 
     { 
      [tblView insertRowsAtIndexPaths:tmpArray withRowAnimation:UITableViewRowAnimationTop]; 
      cell.accessoryView = [DTCustomColoredAccessory accessoryWithColor:[UIColor blackColor] type:DTCustomColoredAccessoryTypeUp]; 
     } 
     [tblView endUpdates]; 
    } 
} 

它提供了错误: 断言失败 - [UITableView的_endCellAnimationsWithContext:],/SourceCache/UIKit_Sim/UIKit-2380.17/UITableView.m:1070 2013年3月20日19 :14:00.102 Daily Achiever [2886:c07] *由于未捕获的异常'NSInternalInconsistencyException',原因:'无效更新:第1节中的行数无效终止应用程序。更新后现有节中包含的行数(3)必须等于更新之前该部分中包含的行数(1),加上或减去插入的行数或d从该部分中选择(插入0,删除0)并加上或减去移入或移出该部分的行数(0移入,0移出)。

回答

0

您的问题是在这行代码:

[tblView deleteRowsAtIndexPaths:tmpArray withRowAnimation:UITableViewRowAnimationTop]; 

[tblView insertRowsAtIndexPaths:tmpArray withRowAnimation:UITableViewRowAnimationTop]; 

,你发布的崩溃是由于第一个。在这些行中,您试图插入/删除表中的行,但您的- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section方法不会相应更改。

无论何时添加/删除表格中的单元格(因为这是从中确定行数的数组),您都希望从appDelegate.array_task数组中添加/删除项目。

作为一个侧面说明,行:

if ([appDelegate.array_task count]==0) { 
    return 0; 
} 

没有做任何事情,因为你有else return [appDelegate.array_task count]这意味着0会如果[appDelegate.array_task count]==0反正返回。

+0

ü可以给我解决..?我在过去两天尝试了很多东西,但仍然面临问题 – Abha 2013-03-20 14:06:02

+0

无论何时在“展开”表格时“删除”表格并向其中添加一个对象,或者在“展开”表格时更改您的“appDelegate.array_task” - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section'来考虑当前表是否被展开(即有一个变量,如果它是扩展的则加1,否则加0) 。 – Jsdodgers 2013-03-20 14:08:34

+0

它没有工作:( – Abha 2013-03-21 06:13:23

0

,同时增加部分使用此代码

NSArray *insertIndexPaths = [NSArray arrayWithObjects: 
          [NSIndexPath indexPathForRow:2 inSection:0], 
          [NSIndexPath indexPathForRow:3 inSection:0], 
          nil]; 

插入行

[tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationRight]; 

如果u要添加两个部分

[tableView insertSections:[NSIndexSet indexSetWithIndex:indexPath.section + 1] withRowAnimation:UITableViewRowAnimationAutomatic]; 
    [tableView insertSections:[NSIndexSet indexSetWithIndex:indexPath.section + 2] withRowAnimation:UITableViewRowAnimationAutomatic]; 

同样的方式删除部分

[tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:YES]; 
    [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section - 1] withRowAnimation:YES]; 

行删除

[tableView deleteRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationRight];