Uitableview 从核心数据模型中删除对象并更新表

Uitableview 从核心数据模型中删除对象并更新表,uitableview,uibarbuttonitem,delete-row,nsfetchedresultscontroller,Uitableview,Uibarbuttonitem,Delete Row,Nsfetchedresultscontroller,我有一个TableViewController(favTable.m),在NSFetchedResultsController的帮助下,它充满了从核心数据模型中提取的数据(1个实体,2个属性)。我在导航栏中包括了一个删除按钮,单击该按钮时,应该删除表中选定的行以及核心数据模型中的相应对象。我正在使用下面的代码作为删除按钮,但它返回错误[favTable delItem]:发送到实例的无法识别的选择器。我该修什么 UIBarButtonItem *delButton = [[UIBarButton

我有一个TableViewController(
favTable.m
),在
NSFetchedResultsController
的帮助下,它充满了从核心数据模型中提取的数据(1个实体,2个属性)。我在导航栏中包括了一个删除按钮,单击该按钮时,应该删除表中选定的行以及核心数据模型中的相应对象。我正在使用下面的代码作为删除按钮,但它返回错误
[favTable delItem]:发送到实例的无法识别的选择器
。我该修什么

UIBarButtonItem *delButton = [[UIBarButtonItem alloc] initWithTitle:@"Del"
                                                              style:UIBarButtonItemStyleBordered
                                                             target:self
                                                             action:@selector(delItem)];

- (void)delItem:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.managedObjectContext = ((ecoAppDelegate *) [UIApplication sharedApplication].delegate).managedObjectContext;

    FavoritesInfo*favoritesInfo = [self.fetchedResultsController objectAtIndexPath:indexPath];

    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                     withRowAnimation:UITableViewRowAnimationFade];

    [self.managedObjectContext deleteObject:favoritesInfo];

    NSError *error= nil;
    if (![self.fetchedResultsController performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }

    [self.tableView reloadData];

}您得到异常是因为您的方法的签名是:
delItem:cellforrowatinedexpath:
,而不仅仅是
delItem

在您的情况下,我认为您不需要
tableView
not
indepath
作为参数

相反,将tableView声明为一个属性(如果是从故事板执行的,那么也可以声明为IBOutlet)

然后您可以使用
self.tableView
访问它

对于所选行,可以使用
indexPathForSelectedRow

NSIndexPath *selectedIndexPath = self.tableView.indexPathForSelectedRow;
现在,您可以将UIButton的操作重写为:

- (void) deleteSelectedItem {
    NSIndexPath *selectedIndexPath = self.tableView.indexPathForSelectedRow;
    //Delete the item using your code
}

你怎么称呼这个方法?如果这是一个按钮的直接动作,它需要是一个iAction而不是void方法。它是一个通过编程设计的UIBarButton@JayVersluisy您的方法的签名是:
delItem:cellforrowatinedexpath:
,而不仅仅是
delItem
。谢谢您的回答。我尝试了您的建议,但出现以下错误:在-[UITableView\u endCellAnimationsWithContext:]、/SourceCache/UIKit\u Sim/UIKit-1914.84/UITableView.m:1037'无效更新:节0中的行数无效。更新(3)后现有节中包含的行数必须等于更新(3)前该节中包含的行数,加上或减去从该节中插入或删除的行数(0插入,1删除),加上或减去移入或移出该节的行数(0移入,0移出)无论如何,这个错误很可能与你的答案无关。你解决了我的问题。谢谢,如果您收到该错误,因为添加/删除单元格时,数据源不会反映该错误。如果你不能解决问题,就发布一个不同的问题。
- (void) deleteSelectedItem {
    NSIndexPath *selectedIndexPath = self.tableView.indexPathForSelectedRow;
    //Delete the item using your code
}