从Core Data Model中删除对象并更新Table

时间:2014-07-24 14:14:57

标签: uitableview uibarbuttonitem delete-row nsfetchedresultscontroller

我有一个TableViewController(favTable.m)并且在NSFetchedResultsController的帮助下,它填充了从核心数据模型(具有2个属性的1个实体)中提取的数据。我在导航栏中包含了一个删除按钮,当单击它时,它应该删除表的选定行,以及核心数据模型中的相应对象。我使用下面的代码删除按钮,但它返回错误[favTable delItem]: unrecognized selector sent to instance。我该怎么办?

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];

}

1 个答案:

答案 0 :(得分:1)

您获得例外是因为您的方法的签名是:delItem:cellForRowAtIndexPath:,而不仅仅是delItem

在您的情况下,我认为您不需要tableView而不是indexPath作为参数。

相反,将tableView声明为属性(如果从故事板中完成,则将IBOutlet声明)。

@property (nonatomic) IBOutlet UITableView *tableView;

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

对于选定的行,您可以使用indexPathForSelectedRow

NSIndexPath *selectedIndexPath = self.tableView.indexPathForSelectedRow;

现在您可以将UIButton的操作重写为:

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