我知道有很多问题,但我看了他们每个人都没有为我找到解决方案。 我从教程中获得了用于编辑表视图中行的位置的代码,并且它完美地工作,但每当我更改视图然后返回到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
数组应该没有问题,但也许这不是正确的事情。
提前谢谢。
答案 0 :(得分:3)
您的方法存在两个问题:
executeFetchRequest:
返回NSArray
个托管对象,但是该命令的顺序
除非您向获取请求添加排序描述符,否则未指定元素。self.data
是已获取对象的可变副本,并重新排序元素
self.data
对核心数据对象完全没有影响。因此,当您更改视图并返回此表视图时,所有元素 将与程序启动时具有相同(未指定)的顺序。
要以明确定义的顺序保留对象,您必须添加属性sortIndex
到实体并使用该键获取具有排序描述符的对象。
在表格视图中重新排列行时,您必须更新sortIndex
属性
这样它就反映了新的秩序。不幸的是,没有内置或“简单”
实现这一目标的方法。
有关详细信息,请查看How to implement re-ordering of CoreData records?。特别是答案https://stackoverflow.com/a/15625897/1187415看起来很有希望,但我没有对它进行测试 自己。