2011-07-21 77 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。您也可以在那裏獲取相關的示例代碼。

當表視圖進入編輯模式,並且當用戶拖動的重排序控制 ,表視圖發送一系列的消息到其數據源 和委託,但只有當他們實現這些方法。這些方法 允許數據源和委託來限制行 是否以及在哪裏可以移動以執行實際的移動操作。