使用 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 单元格

在 IOS6 中使用 Core Data(删除/编辑)

在 Swift 中使用 Core Data 在表格视图的部分中显示数据

在 Core Data 中更改托管对象模型的属性值时崩溃

ios/xcode/core data:更新屏幕的最佳方式

Core Data iCloud 获取有时不会产生数据(iOS)