2013-08-02 30 views
0

当点击节标题时尝试更新我的tableview时,我得到了这个断言。在更新uitableview时断言失败

*断言失败 - [UITableView的_endCellAnimationsWithContext:],/SourceCache/UIKit_Sim/UIKit-2839.5/UITableView.m:1264

我只是想隐藏和显示定制单元每当我点击一个节标题视图。

如果我用更新数据替换更新代码,代码就可以正常工作。但是这并不顺畅:(

- (void)noteSectionHeader:(UTNoteSectionHeader *)noteSectionHeader sectionTapped:(NSInteger)section 
{ 
    UTNoteItem* noteItem = self.notes[section]; 
    BOOL alreadySelected = noteItem.selected; 
    if (alreadySelected) { 
     self.selectedSection = NSNotFound; 
     [self setSelected:NO forSection:section]; 
    } 
    else { 
     self.selectedSection = section; 
     [self setSelected:YES forSection:section]; 
    } 

    [self updateSections]; 
} 

- (void)setSelected:(BOOL)selected forSection:(NSInteger)section 
{ 
    UTNoteItem* noteItem = self.notes[section]; 
    noteItem.selected = selected; 
    for (UTNoteItem* tmpItem in self.notes) { 
     if (tmpItem != noteItem) { 
      tmpItem.selected = NO; 
     } 
    } 
} 

- (void)updateSections 
{ 
    NSMutableArray* deletePaths = [[NSMutableArray alloc] init]; 
    NSMutableArray* addPaths = [[NSMutableArray alloc] init]; 


    for (UTNoteItem* item in self.notes) { 
     if (item.selected) { 
      [addPaths addObject:[NSIndexPath indexPathForRow:0 inSection:[self.notes indexOfObject:item]]]; 
     } 
     else { 
      [deletePaths addObject:[NSIndexPath indexPathForRow:0 inSection:[self.notes indexOfObject:item]]]; 
     } 
    } 

    [self.tableView beginUpdates]; 
    [self.tableView deleteRowsAtIndexPaths:deletePaths withRowAnimation:YES]; 
    [self.tableView insertRowsAtIndexPaths:addPaths withRowAnimation:YES]; 
    [self.tableView endUpdates]; 

} 


#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return self.notes.count; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    UTNoteItem* itemNote = self.notes[section]; 
    if (itemNote.selected) return 1; 
    return 0; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return 40; 
} 

编辑:

这是我的新的实现:

-

(void)noteSectionHeader:(UTNoteSectionHeader *)noteSectionHeader sectionTapped:(NSInteger)section 
{ 
    /* Check if a section is opened */ 
    if (self.selectedSection != NSNotFound) { 
     /* A section is open, get the item */ 
     UTNoteItem* theItem = self.notes[self.selectedSection]; 
     /* if the item is the section opened, close it */ 
     if (self.selectedSection == section) { 
      theItem.selected = NO; 
      self.selectedSection = NSNotFound; 

     } 
     /* The item is not the section, so open it, and close the previous item */ 
     else { 
      theItem.selected = YES; 
      UTNoteItem* prevItem = self.notes[self.selectedSection]; 
      prevItem.selected = NO; 
      self.selectedSection = section; 
     } 
    } 
    /* Nothin is open, just open the section */ 
    else { 
     self.selectedSection = section; 
     UTNoteItem* openItem = self.notes[self.selectedSection]; 
     openItem.selected = YES; 
    } 
    /* Reload the selected section.. this will not reload the other sections? */ 
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationAutomatic]; 
} 

回答

1

我也有过类似的问题,但是我执行像重载所以:

- (void)noteSectionHeader:(UTNoteSectionHeader *)noteSectionHeader sectionTapped:(NSInteger)section 
{ 
     //check our action 
     if(<will hide section>) { 
      //hide section 
      <some action> 
     } else { 
      //show section 
      <some action> 
     } 
     [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationAutomatic]; 
    } 

并再次将其重新加载不同用强制更新:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSInteger nRows = 0; //no rows when closed 

    if(<check section is open>) { 
     nRows +=<number of data items shown>; 
    } 

    return nRows; 
} 

凡indexpath.section是我要隐藏或显示部分。它是平稳和稳定的。 在我看来,删除和添加行是有点危险的,tableviews非常擅长在各个部分或单元格上进行动画重新加载。

+0

我其实不会将行用作“标题”。我使用部分作为我的主标题。所以我的行数是0,直到一个部分被点击。那么它应该是1(现在) – chrs

+0

然后请相应地调整它。逻辑是一样的。你的部分将有0行,如果它是不可见的,并且点击事件将是 - (void)noteSectionHeader:(UTNoteSectionHeader *)noteSectionHeader sectionTapped:(NSInteger)部分 –

+0

我已经调整了答案以更贴近你的场景,让我知道这是否有帮助; –