更新uitableview时断言失败

时间:2013-08-02 00:40:26

标签: ios objective-c runtime-error

在单击节标题时尝试更新我的tableview时,我得到了这个断言。

* 断言失败 - [UITableView _endCellAnimationsWithContext:],/ SourceCache / UIKit_Sim / UIKit-289.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 个答案:

答案 0 :(得分: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非常擅长对单个部分或单元格进行动画重新加载。