我有UITableViewController
正确显示与NSOrderedSet
相关联的NSManagedObject
。在此UITableView
上,我已经配置了一个按钮,可以进行编辑,并且我可以毫无问题地重新排序NSOrderedSet
中的项目。当我试图删除时没有任何反应 - 也许最令人沮丧的是,它并没有崩溃。
不幸的是,我无法将其配置为删除单元格。我错过了什么?
我的viewDidLoad
最初加载self.isEditing = NO
。
我配置了UIButton
,可在self.isEditing
和YES
之间切换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的问题,我实施了editingStyleForRowAtIndexPath
和editingStyleForRowAtIndexPath
,是的。他们在这里:
- (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}}
我想我可以从这里弄明白。我会在早上更新到最终的解决方案 - 在发现这个愚蠢的错误并在早上起床时将我的马刺挂起来傍晚:)
答案 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
感谢大家的投入!