1

我知道对此有很多问题,但我查看了每一个问题,却没有找到适合我的解决方案。我从教程中获得了用于编辑表格视图中行的位置的代码,它运行良好,但是每当我更改视图然后返回 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数组应该没有问题,但也许这不是正确的事情。提前致谢。

4

1 回答 1

3

你的方法有两个问题:

  • executeFetchRequest:返回一个NSArray托管对象,但未指定元素的顺序,除非您向获取请求添加排序描述符。
  • Yourself.data是获取对象的可变副本,重新排序 的元素self.data对 Core Data 对象没有任何影响。

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

为了使对象保持明确定义的顺序,您必须向sortIndex 实体添加一个属性,并使用该键使用排序描述符获取对象。

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

看看如何实现 CoreData 记录的重新排序?了解更多信息。特别是答案https://stackoverflow.com/a/15625897/1187415看起来很有希望,但我自己没有测试过。

于 2013-10-20T10:38:42.387 回答