从UITableView删除部分时崩溃应用程序

时间:2013-07-04 11:05:50

标签: objective-c uitableview

tableview我有很多部分,在第一行的第一行我有一个删除按钮,我想在点击按钮后删除部分,但它崩溃请帮助我怎么办?这是代码......

//****** adding delete section button
     CellButton *_sectionButton = (CellButton*)[cell viewWithTag:10];
     _sectionButton.hidden = YES;
     _sectionButton.indexPath = indexPath;
     [_sectionButton addTarget:self action:@selector(sectionDeleteButton:)      forControlEvents:UIControlEventTouchUpInside];

-(void)sectionDeleteButton: (id)sender
{
   CellButton *_secbtn = (CellButton*)sender;
   NSInteger sectionNumber = _secbtn.indexPath.section;
   [self.tableView beginUpdates];
   [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionNumber] withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.tableView endUpdates];
    [self.tableView reloadData];

}

编辑:错误消息是:

  

断言失败 - [UITableView _endCellAnimationsWithContext:],/ SourceCache / UIKit_Sim / UIKit-2380.17 / UITableView.m:1054 2013-07-04 04:25:15.921估计[9025:c07] ***终止应用程序未捕获的异常'NSInternalInconsistencyException',原因:'无效更新:无效的节数。更新后的表视图中包含的节数(2)必须等于更新前的表视图中包含的节数(2),加上或减去插入或删除的节数(0插入,1删除)

5 个答案:

答案 0 :(得分:4)

我想numberOfSectionsInTableView:会返回之前的部分数。您必须确保您告诉表视图的内容也发生在数据源中。也就是说,如果删除某个部分,则numberOfSectionsInTableView也必须返回比之前少的数字。同样代表细胞和其他一切。这可能是你得到的错误中描述的。

答案 1 :(得分:1)

您必须使用numberOfScetionsInTableview:委托方法

管理您的部分

答案 2 :(得分:0)

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
//#warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//#warning Incomplete method implementation.
    // Return the number of rows in the section.
    return  [MLControl shared].arrBuyList.count;//1;//[MLControl shared].arrBuyList.count;
}

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
       // [tableView beginUpdates];
        NSLog(@"indexPath.row=%ld,indexPath.se=%ld",(long)indexPath.row,(long)indexPath.section);
        [[MLControl shared].arrBuyList removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    //    [tableView endUpdates];
    } else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }   
}

答案 3 :(得分:0)

我遇到了这个问题,但原因与你的不同。

当我为tableView添加一个部分时,我使用这种方法重新加载数据,这也像你的一样崩溃了:

[tableView reloadRowsAtIndexPaths:[tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];

为什么我使用此方法重新加载我的表?如果我只刷新单元格,这很好,但我忘记了我想要更改部分。有关详细信息:What is More reliable way to reload UITableView Data?

答案 4 :(得分:-2)

如果我正确理解了问题,您实际上甚至不必删除该行。如果表视图中的每个部分下面只有一行,您只需更新numberofsections变量并重新加载表,就会自动删除进程中的行

if editingStyle == UITableViewCellEditingStyle.Delete {

    sectionCount -= 1
    tableView.reloadData()

    heightConstraint.constant -= 103

}