使用 Core Data 在表格视图中编辑行位置
Posted
技术标签:
【中文标题】使用 Core Data 在表格视图中编辑行位置【英文标题】:Edit rows position in a table view with Core Data 【发布时间】:2013-10-20 09:53:03 【问题描述】:我知道有很多关于此的问题,但我查看了每个问题,但没有找到适合我的解决方案。 我从教程中获得了用于编辑表格视图中行的位置的代码,它运行良好,但是每当我更改视图然后返回 tableView 页面(我认为发生 ViewDidAppear 方法)所有编辑的行回到他们之前的位置。 这是我的代码:
与按钮相关的编辑操作:
- (void)editAction:(id)sender
if(self.editing)
[super setEditing:NO animated:NO];
[[self tableView] setEditing:NO animated:NO];
[[self tableView] reloadData];
[self.navigationItem.leftBarButtonItem setTitle:@"Edit"];
[self.navigationItem.leftBarButtonItem setStyle:UIBarButtonItemStylePlain];
[_tableData removeAllObjects];
else
[super setEditing:YES animated:YES];
[[self tableView] setEditing:YES animated:YES];
[[self tableView] reloadData];
[self.navigationItem.leftBarButtonItem setTitle:@"Done"];
[self.navigationItem.leftBarButtonItem setStyle:UIBarButtonItemStyleDone];
[_tableData removeAllObjects];
编辑方法:
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
NSString *item = [self.datas objectAtIndex:fromIndexPath.row];
[self.datas removeObjectAtIndex:fromIndexPath.row];
[self.datas insertObject:item atIndex:toIndexPath.row];
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
// Return NO if you do not want the item to be re-orderable.
return YES;
ViewDidAppear
- (void)viewDidAppear:(BOOL)animated
[super viewDidAppear:animated];
[_tableData removeAllObjects];
// Fetch the devices from persistent data store
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Data"];
self.datas = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
[self.tableView reloadData];
cellForRowAtIndexPath:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (tableView == self.searchDisplayController.searchResultsTableView)
cell.textLabel.text = [_searchDati objectAtIndex:indexPath.row];
else
NSString *string;
//configure cells
NSManagedObject *data = [self.datas objectAtIndex:indexPath.row];
string = [NSString stringWithFormat:@"%@", [data valueForKey:@"name"]];
[cell.detailTextLabel setText:nil];
cell.textLabel.text = string;
//tableData array used for filtering
[_tableData addObject:string];
return cell;
NSMutableArray tableData 仅用于UISearchbar
。
我无法弄清楚问题出在哪里。核心数据与@property (strong) NSMutableArray *datas;
相关,所以我认为修改datas
数组应该没有问题,但也许这不是正确的事情。
提前致谢。
【问题讨论】:
【参考方案1】:你的方法有两个问题:
executeFetchRequest:
返回托管对象的 NSArray
,但
元素未指定,除非您向获取请求添加排序描述符。
您的self.data
是所获取对象的可变副本,并对元素重新排序
self.data
对 Core Data 对象没有任何影响。
因此,当您更改视图并返回此表视图时,所有元素 将具有与程序启动时相同(未指定)的顺序。
要使对象保持明确定义的顺序,您必须添加属性sortIndex
到实体并使用该键获取具有排序描述符的对象。
在表格视图中重新排列行时,您必须更新sortIndex
属性
使其反映新秩序。不幸的是,没有内置的或“简单的”
实现这一目标的方法。
查看How to implement re-ordering of CoreData records? 了解更多信息。特别是https://***.com/a/15625897/1187415 的答案看起来很有希望,但我没有测试它 我自己。
【讨论】:
谢谢你的回答!再问一个问题,sortIndex应该是Core Data Entity的一个属性吧? @ObiWanKeNerd:是的,完全正确。以上是关于使用 Core Data 在表格视图中编辑行位置的主要内容,如果未能解决你的问题,请参考以下文章
使用 Core Data 使用 didSelectRowAtIndexPath 编辑 TableView 单元格