2011-07-21 40 views
5

我想让我的UITableView可编辑,所以你可以移动单元格。现在,当我点击编辑按钮时,它只会让我删除,但不会重新排列。如何让UITableView重新排列?

我的方法是:

Code: 
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return YES; 
} 

- (void)setEditing:(BOOL)editing animated:(BOOL)animate 
{ 
    [self.routineTableView setEditing: !self.routineTableView.editing animated:YES]; 

    if (self.routineTableView.editing) 
     [self.navigationItem.leftBarButtonItem setTitle:@"Done"]; 
    else 
     [self.navigationItem.leftBarButtonItem setTitle:@"Edit"]; 
} 

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
     NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 
     [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]]; 
     NSLog(@"fetched results : \n%@\n",[self.fetchedResultsController fetchedObjects]); 

     NSError *error = nil; 

     if (![managedObjectContext save:&error]) 
     { 
      // Handle the error. 
     } 
    } 

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

回答

8

为了实现正确的重新排序行,表视图的数据源应该实现类似的方法:

-(BOOL)tableView:(UITableView *)tableView 
canMoveRowAtIndexPath:(NSIndexPath *)indexPath; 
-(void)tableView:(UITableView *)tableView 
moveRowAtIndexPath:(NSIndexPath *)fromIndexPath 
     toIndexPath:(NSIndexPath *)toIndexPath; 

和其委托可以实现:

-(NSIndexPath *)tableView:(UITableView *)tableView 
targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath 
        toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath; 

也有这个page给你代码的例子。

2

你一定要读documentation。您也可以在那里获取相关的示例代码。

当表视图进入编辑模式,并且当用户拖动的重排序控制 ,表视图发送一系列的消息到其数据源 和委托,但只有当他们实现这些方法。这些方法 允许数据源和委托来限制行 是否以及在哪里可以移动以执行实际的移动操作。