2010-12-08 52 views
12

我閱讀了有關如何管理UITableView中行的刪除和重新排序的文檔。我創建了編輯按鈕,我可以刪除行。我希望用戶能夠對行重新排序。這似乎很簡單,但我不明白如何告訴細胞,他們可以被移動。如何使用刪除按鈕顯示UITableView中的重新排序控件

要告訴他們可以刪除的行我使用editingStyleForRowAtIndexPath,但如何告訴單元它也可以被移動,我在哪裏設置showsReorderControl?我試圖放置在cellForRowAtIndexPath,但沒有顯示。

謝謝!

回答

32

你不得不說,行可以被移動:

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

和實施該委託更新您的數據源:

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

Table View Programming Guide for iOS

+0

這就是牛逼他正在閱讀的文檔。我已經完全按照這種方式實現了該方法。但我仍然無法移動任何東西。我可以刪除行。 – 2010-12-08 13:26:23

2

Managing the Reordering of Rows添加到@benoit上面的答案。如果你的模型恰好是一個可變的數組,這樣的事情就足夠了的tableView:moveRowAtIndexPath:toIndexPath:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath 
{ 
    id objectToMove = [_objects objectAtIndex:fromIndexPath.row]; 
    [_objects removeObjectAtIndex:fromIndexPath.row]; 
    [_objects insertObject:objectToMove atIndex:toIndexPath.row];  
    [tableView reloadData]; 
    [self saveObjects]; // A method of your own to make new positions persistent 
} 
1

嘗試。 。 。這將處理簡單的tableview的情況下

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

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath 
{ 
    [tableData insertObject: [tableData objectAtIndex:sourceIndexPath.row] atIndex:destinationIndexPath.row]; 
    [tableData removeObjectAtIndex:(sourceIndexPath.row + 1)]; 
} 
4

在我的情況下,蘋果的文件中,並在這裏的答案中提到我已經實現了所有必需的UITableViewDelegate方法安排和細胞的更新,但仍不能看到的重新排序控制。最終我發現這是因爲我重寫了layoutSubviews方法而不調用超級的默認實現。在我添加[super layoutSubviews]之後,我的重新排序控件終於出現了。

我們需要調用[super layoutSubviews]的原因是,當我們切換表格的編輯屬性時,它會調用單元格的layoutSubviews方法,系統提供的控件(如重新排序控件)顯示在UITableViewCell的默認layoutSubviews方法中。一旦你意識到這一點,你也可以修改你的layoutSubviews實現來改變你的單元格的外觀,這取決於它是否被編輯,以便在重新排序控件出現時使它不那麼笨拙。

所以這裏是該行重新排序清單:

  1. 確保委託方法的tableView:canMoveRowAtIndexPath和的tableView:moveRowAtIndexPath:toIndexPath實現
  2. 確保的tableView的編輯屬性設置爲YES
  3. 如果你有一個自定義的UITableViewCell,請確保您撥打 [超級layoutSubviews]如果重寫此方法
相關問題