UITableView核心数据重排序 [英] UITableView Core Data reordering

查看:96
本文介绍了UITableView核心数据重排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道这个问题之前已被问过,我看看此问题。然而,我仍然困惑的如何在核心数据项目中使用UITableView实现重排序。我知道的是,我需要在我的实体中有一个displayOrder属性来跟踪项目的顺序,我需要枚举所有的对象在获取的结果,并设置他们的displayOrder属性。

I know this question has been asked before, and I took a look at the answer to this question. However, I'm still confused as to how to implement reordering with a UITableView in a Core Data project. What I know is that I need to have a "displayOrder" attribute in my Entity to track the order of items, and I need to enumerate through all the objects in the fetched results and set their displayOrder attribute.

在我链接到的问题的给定代码中,表视图委托方法调用类似于 [self FF_fetchResults]; 的方法,

In the given code in the question I linked to, the table view delegate method calls a method like this [self FF_fetchResults];, and the code for that method is not given so its hard to tell what exactly it is.

有没有示例代码演示这个?

Is there any sample code that demonstrates this? That would be simpler to look at than sharing large chunks of code.

感谢

推荐答案

我不知道你遇到麻烦的部分(基于评论)...但这里是我的建议。 displayOrder只是NSManagedObject类的一个简单属性。如果您可以保存受管对象,那么您将能够完成此功能。让我们先看一个简单的NSManagedObject:

I'm not sure which part you are having trouble with (based on the comments)... but here is my suggestion. The displayOrder is just a simple attribute on a NSManagedObject class. If you can save a managed object, then you will be able finish this feature. Lets first take a simple NSManagedObject:

@interface RowObj :  NSManagedObject  
{
}

@property (nonatomic, retain) NSString *rowDescription;
@property (nonatomic, retain) NSNumber *displayOrder;

接下来,我们需要在tableview中显示数据的本地副本。我已阅读通过您的评论,我不确定是否使用FetchedResultsController或不。我的建议是开始简单,只是使用一个正常的tableviewcontroller,你更新行数据,每当用户更改显示顺序...然后保存顺序,当用户完成编辑。

Next, we need to have local copy of the data being displayed in the tableview. I have read through the comments you have made and I'm not really sure if you are using the FetchedResultsController or not. My suggestion would be to start simple and just use a normal tableviewcontroller where you update the row data whenever a user changes the display order... then save the order when the user is done editing.

此tableviewcontoller的界面如下所示:

The interface for this tableviewcontoller would look like this:

@interface MyTableViewController : UITableViewController {
    NSMutableArray *myTableViewData;
}

@property(nonatomic,retain) NSMutableArray *myTableViewData;

@end 

接下来,我们需要加载表视图数据在viewWillAppear方法中:

Next, we need to load the the table view data in the viewWillAppear method:

- (void)viewWillAppear:(BOOL)animated {
    myTableViewData = [helper getRowObjects]; // insert method call here to get the data
    self.navigationItem.leftBarButtonItem = [self editButtonItem];
}

这里有两件事情... editButtonItem)第一个是我们需要从CoreData获取我们的数据。当我有这样做我有一些帮助(称它为你想要的)对象做的工作。一个典型的find方法如下:

There are 2 things going on here... (I'll explain the editButtonItem later) the first is that we need to get our data from CoreData. When I have to do this I have some sort of helper(call it what you want) object do the work. A typical find method would look like this:

- (NSMutableArray*) getRowObjects{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"RowObj" inManagedObjectContext:[self managedObjectContext]];
    [request setEntity:entity];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"displayOrder" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [request setSortDescriptors:sortDescriptors];
    [sortDescriptors release];
    [sortDescriptor release];

    NSError *error;
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (mutableFetchResults == nil) {
        // Handle the error.
    }
    [request release];
    return mutableFetchResults;
}


$ b $ p

现在您已经有了数据,现在可以等待用户编辑桌子。这是 [self editButtonItem] 发挥作用的地方。这是一个内置功能,返回一个条形按钮项目,以切换其标题和相关状态在编辑和完成之间。当用户点击该按钮时,它将调用setEditing:animated:方法:

Now that you have your data, you can now wait for the user to edit the table. That is where the [self editButtonItem] comes into play. This is a built in feature that returns a bar button item that toggles its title and associated state between Edit and Done. When the user hits that button, it will invoke the setEditing:animated: method:

要更新显示顺序,您需要覆盖UITableViewController类上的setEditing方法。它应该看起来像这样:

To update the display order you need to override the setEditing method on the UITableViewController class. It should look something like this:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];
    [myTableView setEditing:editing animated:animated];
    if(!editing) {
        int i = 0;
        for(RowObj *row in myTableViewData) {
            row.displayOrder = [NSNumber numberWithInt:i++];
        }
        [helper saveManagedObjectContext]; // basically calls [managedObjectContext save:&error];
    }
}

我们不需要做任何事情是在编辑模式...我们只想保存一旦他们按下了完成按钮。当用户拖动表中的行时,您可以通过覆盖canMoveRowAtIndexPath和moveRowAtIndexPath方法更新显示顺序:

We don't have to do anything when the user is in edit mode... we only want to save once they have pressed the "Done" button. When a user drags a row in your table you can update your display order by overriding the canMoveRowAtIndexPath and moveRowAtIndexPath methods:

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    return true;
}

(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {

    RowObj *row = [myTableViewData objectAtIndex:sourceIndexPath.row];
    [myTableViewData removeObjectAtIndex:sourceIndexPath.row];
    [myTableViewData insertObject:row atIndex:destinationIndexPath.row];
}

同样,我不更新displayOrder值的原因是因为用户仍然处于编辑模式...我们不知道用户是否完成编辑,他们甚至可以通过不按完成按钮来取消所做的操作。

Again, the reason I don't update the displayOrder value here is because the user is still in edit mode... we don't know if the user is done editing AND they could even cancel what they've done by not hitting the "Done" button.

EDIT

如果您要删除某行,则需要覆盖 tableView:commitEditingStyle:forRowAtIndexPath ,并执行以下操作: / p>

If you want to delete a row you need to override tableView:commitEditingStyle:forRowAtIndexPath and do something like this:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the managed object at the given index path.
        RowObj *row = [myTableViewData objectAtIndex:indexPath.row];
        [helper deleteRow:row];

        // Update the array and table view.
        [myTableViewData removeObjectAtIndex:indexPath.row];
        [myTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
    }   
}

这篇关于UITableView核心数据重排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆