从UITableView中的NSOrderedSet中删除NSManagedObject

时间:2015-07-30 22:03:14

标签: ios objective-c uitableview core-data

我有UITableViewController正确显示与NSOrderedSet相关联的NSManagedObject。在此UITableView上,我已经配置了一个按钮,可以进行编辑,并且我可以毫无问题地重新排序NSOrderedSet中的项目。当我试图删除时没有任何反应 - 也许最令人沮丧的是,它并没有崩溃。

不幸的是,我无法将其配置为删除单元格。我错过了什么?

我的viewDidLoad最初加载self.isEditing = NO

我配置了UIButton,可在self.isEditingYES之间切换NO- (IBAction)toggleEditButton:(UIBarButtonItem *)sender { // You need to do 2 things: // 1 - Edit if (self.isEditing == NO) { NSLog(@"isEditing is in edit mode"); self.editButton.title = @"Done"; self.isEditing = YES; [self.tableView setEditing:YES animated:YES]; } else { // 2 - Save NSLog(@"isEditing is in save mode"); self.editButton.title = @"Edit"; self.isEditing = NO; [self.tableView setEditing:NO animated:YES]; } }

self.isEditing

YES设置为NSOrderedSet时,我可以在NSOrderedSet中移动项目并保存重新排序的commitEditingStyle

这是我的- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { // Delete the row from the data source [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; // [self.myManagedObject.myNSOrderedSet.mutableCopy removeObjectAtIndex:indexPath.row]; self.myManagedObject.myNSOrderedSet = self.myManagedObject.myNSOrderedSet.mutableCopy; [tableView reloadData]; } 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 }

UITableViewController

感谢您的阅读。我欢迎你的意见。

更新 我在下面尝试了几个解决方案,并且此customCell上的行为仍然相同 - 重新排序控件显示,但在编辑模式下没有任何删除和滑动删除。

我配置了canEditRowAtIndexPath。布局限制可以覆盖一些东西吗?

更新2 为了回应Paulw11的问题,我实施了editingStyleForRowAtIndexPatheditingStyleForRowAtIndexPath,是的。他们在这里:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { return YES; }

UITableViewCellEditingStyleNone

这似乎是我的大部分问题。我最初把它设置为canEditRowAtIndexPath。我从来没有"碰到"我重新安排工作的问题,所以我没想到要看那里。我更新如下。

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { // Originally, code was: // return UITableViewCellEditingStyleNone if (self.isEditing == YES) { return UITableViewCellEditingStyleDelete; } else { return UITableViewCellEditingStyleNone; } }

'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of
 rows in section 0.  The number of rows contained in an existing section after 
the update (3) must be equal to the number of rows contained in that section 
before the update (3), plus or minus the number of rows inserted or deleted from 
that section (0 inserted, 1 deleted) and plus or minus the number of rows moved 
into or out of that section (0 moved in, 0 moved out).'

现在我收到了这个错误:

{{1}}

我想我可以从这里弄明白。我会在早上更新到最终的解决方案 - 在发现这个愚蠢的错误并在早上起床时将我的马刺挂起来傍晚:)

3 个答案:

答案 0 :(得分:3)

我认为问题出在以下几个方面:

[self.myManagedObject.myNSOrderedSet.mutableCopy removeObjectAtIndex:indexPath.row];
self.myManagedObject.myNSOrderedSet = self.myManagedObject.myNSOrderedSet.mutableCopy;

第一行创建有序集的可变副本,然后删除一个对象。 第二行创建原始集的另一个可变副本。

尝试分配临时变量:

NSMutableOrderedSet *tempSet = self.myManagedObject.myNSOrderedSet.mutableCopy;
[tempSet removeObjectAtIndex:indexPath.row];
self.myManagedObject.myNSOrderedSet = tempSet;

答案 1 :(得分:1)

myNSOrderedSet核心数据关系属性吗?如果是这样,你应该使用

[[mymanagedObject mutableOrderedSetValueForKey:@"myNSOrderedSet"] removeObjectAtIndex:indexPath.row]

就是这样;您不需要将其分配回myNSOrderedSet

(请注意,根据您的表格视图的数据来源,您可能需要在对象的save)上调用NSManagedObjectContext

答案 2 :(得分:1)

事实证明,我住在?的大多数问题。我原来的方法,当我只重新排序editingStyleForRowAtIndexPath时,我没有触及,看起来像这样:

tableView

在paul11查询我的实现中的内容后,我更新了这个:

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewCellEditingStyleNone;
}

此外,我在 pbasdf 的建议中更新了- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { if (self.isEditing == YES) { return UITableViewCellEditingStyleDelete; } else { return UITableViewCellEditingStyleNone; } } ,如下所示:

commitEditingStyle

感谢大家的投入!