使用Core Data在表视图中编辑行位置

时间:2013-10-20 09:53:03

标签: ios objective-c uitableview core-data

我知道有很多问题,但我看了他们每个人都没有为我找到解决方案。 我从教程中获得了用于编辑表视图中行的位置的代码,并且它完美地工作,但每当我更改视图然后返回到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 个答案:

答案 0 :(得分:3)

您的方法存在两个问题:

  • executeFetchRequest:返回NSArray个托管对象,但是该命令的顺序 除非您向获取请求添加排序描述符,否则未指定元素。
  • 您的self.data是已获取对象的可变副本,并重新排序元素 self.data对核心数据对象完全没有影响。

因此,当您更改视图并返回此表视图时,所有元素 将与程序启动时具有相同(未指定)的顺序。

要以明确定义的顺序保留对象,您必须添加属性sortIndex 到实体并使用该键获取具有排序描述符的对象。

在表格视图中重新排列行时,您必须更新sortIndex属性 这样它就反映了新的秩序。不幸的是,没有内置或“简单” 实现这一目标的方法。

有关详细信息,请查看How to implement re-ordering of CoreData records?。特别是答案https://stackoverflow.com/a/15625897/1187415看起来很有希望,但我没有对它进行测试 自己。