单击按钮删除后删除TableView

时间:2013-02-21 19:36:13

标签: iphone ios

所以我试图删除表视图中的行。

这是我的代码:

- (IBAction)done:(UIStoryboardSegue *)segue
{
    DetailGodsViewController *detailController = [segue sourceViewController];  
    NSIndexPath *path = [NSIndexPath indexPathForRow:detailController.row inSection:detailController.section];
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:path]
                     withRowAnimation:NO];
    [self.listOfGoods deleteGood: detailController.row];
    [[self tableView] reloadData];
    [self dismissViewControllerAnimated:YES completion:NULL];
}

我在storyBoard中有ControlViewTable,在我点击ControlViewTable中的一行后,它跳转到Detail视图并且还有其他信息,我也存储了关于此函数中行和部分的信息:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"ShowGoodDetails"]) {
    DetailGodsViewController *detailViewController = [segue destinationViewController];

    detailViewController.row = [self.tableView indexPathForSelectedRow].row;
    detailViewController.section = [self.tableView indexPathForSelectedRow].section;
    detailViewController.good = [self.listOfGoods getGoodAtIndex:detailViewController.row ];
}

并且在详细视图中还有一个按钮用于删除,点击它后,它会跳转到该功能:

- (IBAction)done:(UIStoryboardSegue *)segue.

但它总是在deleteRows中崩溃。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

一个问题可能是,当您试图摆脱包含按钮的单元格时,您仍然在响应按钮。您需要让该操作方法结束,然后调用deleteRows。你应该做我推荐的那种事情:

https://stackoverflow.com/a/13907375/341994

但是,最大的问题可能是您必须在删除表格的一行之前更新模型数据。

答案 1 :(得分:1)

done:方法中的代码正在执行一些无序操作以及一些您不需要的额外操作。它应该是:

- (IBAction)done:(UIStoryboardSegue *)segue
{
    DetailGodsViewController *detailController = [segue sourceViewController];  
    NSIndexPath *path = [NSIndexPath indexPathForRow:detailController.row inSection:detailController.section];
    [self.listOfGoods deleteGood: detailController.row];
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:path]
                     withRowAnimation:NO];
    [self dismissViewControllerAnimated:YES completion:NULL];
}

基本上,您需要在更新表之前更新数据。此外,请勿在致电reloadData后致电deleteRowsAtIndexPaths:。做其中一个,而不是两个。