2009-10-11 85 views
3

我有一個tableview有幾個部分。我希望能夠將行從一個部分移動到另一個部分,並在沒有行時刪除部分。我試圖通過moveRowAtIndexPath來做到這一點,但我有代碼不起作用,並引發NSRangeException異常。moveRowAtIndexPath:如何刪除一節最後一行被移動到另一節

下面是一個代碼示例:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 

    NSUInteger fromSection = [fromIndexPath section]; 
    NSUInteger fromRow = [fromIndexPath row]; 
    NSString *fromKey = [self.keys objectAtIndex:fromSection]; 
    NSMutableArray *fromEventSection = [self.eventsDict objectForKey:fromKey]; 

    NSUInteger toSection = [toIndexPath section]; 
    NSUInteger toRow = [toIndexPath row]; 
    NSString *toKey = [self.keys objectAtIndex:toSection]; 
    NSMutableArray *toEventSection = [self.eventsDict objectForKey:toKey]; 

    id object = [[fromEventSection objectAtIndex:fromRow] retain]; 
    [fromEventSection removeObjectAtIndex:fromRow]; 
    [toEventSection insertObject:object atIndex:toRow]; 
    [object release]; 
    // The above code works just fine! 

    // Try to delete an empty section. Here is where trouble begins: 
    if ((fromSection != toSection) && [fromEventSection count] == 0) { 
     [self.keys removeObjectAtIndex:fromSection]; 
     [self.eventsDict removeObjectForKey:fromKey]; 

     [tableView deleteSections:[NSIndexSet indexSetWithIndex:fromSection] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
+0

弄來這個答案。我想不出來 – 2009-11-16 22:50:25

+0

不完全。但我的確如下所述: 我停止嘗試在用戶移動行時刪除空白部分,而是在用戶完成編輯後選擇刪除空白部分。然而,即使如此,刪除和空白部分也不能正常工作(我懷疑蘋果的bug)。所以爲了刪除空白部分,我最終在每個空白部分中添加了一行零高度,然後刪除這些部分。 看看YouTube上的這個演示:http://tinyurl.com/ycg4uhs,看看這種方法是否適合你。 – Sergio 2009-11-18 12:52:06

回答

3

我有運氣通過包裹在一個dispatch_async去除執行到moveRowAtIndexPath方法的端部之後的塊中的deleteSections方法。

dispatch_async(dispatch_get_main_queue(), ^{ 
     if ((fromSection != toSection) && [fromEventSection count] == 0) { 
      [self.keys removeObjectAtIndex:fromSection]; 
      [self.eventsDict removeObjectForKey:fromKey]; 
      [tableView deleteSections:[NSIndexSet indexSetWithIndex:fromSection] withRowAnimation:UITableViewRowAnimationFade]; 
     } 
    }); 
+0

這很好用。謝謝! – akw 2013-05-18 12:17:45

0

這也給了我一些悲傷。我使用延遲執行刪除部分已取得了成功。

以下是我得到它的工作 - 假設你使用一個商店包含所有的對象,和實體店有方法可以挪動的物品:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
    NSInteger beforeSectionCount = [store sectionCount]; 
    [store moveObject:fromIndexPath toIndexPath:toIndexPath]; 
    if (beforeSectionCount > [store sectionCount] 
     [self performSelector:@selector(deleteSection:) withObject:fromIndexPath: afterDelay:0.2] 
} 

- (void)deleteSection:(NSIndexPath *)indexPath { 
    [[self tableView] beginUpdates]; 
    [[self tableView] deleteSections:[NSIndexSet indexSetWithIndex:[indexPath section]] 
       withRowAnimation:UITableViewRowAnimationFade]; 
    [[self tableView] endUpdates]; 
} 
相關問題