2011-05-23 58 views
10

我有一個UITableView,我希望能夠在不處於編輯模式時對行進行重新排序,這意味着我不想看到刪除圖標,直到按Edit。我希望能夠始終查看和使用重新排序的控件。那可能嗎?在不處於編輯模式時重新排序UITableView上的控件?

我是否必須始終保持UITableView處於編輯模式並手動啓用/禁用刪除圖標?如何在這種情況下禁用滑動刪除?

+0

爲每個單元格設置UITableViewCellEditingStyle標誌並實現canMoveRowAtIndexPath和canEditRowAtIndexPath UITableViewDataSource委託方法。不確定您是否必須永久處於編輯模式才能執行此操作。通過這種方式,將停止滑動刪除 – TheBlack 2011-05-23 13:58:33

回答

7

據我所知,你不能只使用編輯標誌。但是,獲得類似效果並不困難。

有自己的布爾值,即deleting。將表格單元格設置爲cell.showsReorderControl = YES。 然後執行移動單元格所需的所有方法。我認爲你正在尋找的代碼是。如果deleting == YES返回UITableViewCellEditingStyleDelete,否則返回UITableViewCellEditingStyleNone。 最後,總是設置tableView.editing = YES。如果在更改deleting布爾之前和之後運行[tableView beginUpdates][tableView endUpdates]一切都應該正常工作。讓我知道如果這沒有意義,我會再試一次。

+5

。 – mackross 2011-05-25 16:44:43

+0

我的確喜歡這樣。很好地工作。不過,我沒有使用滑動刪除。 – Shades 2011-05-26 08:10:16

+0

我都試過,但我仍需要實現: ** tableview.editing = YES; ** ,它顯示的紅色按鈕,刪除.. 我想只是重新排序細胞無任何編輯功能。 ..你可以提供一些示例代碼:[email protected] – 2012-05-14 11:42:03

7

沒有刪除和沒有縮進的重新排序。

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

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return UITableViewCellEditingStyleNone; 
} 

- (BOOL)tableView:(UITableView *)tableview shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath { 
    return NO; 
} 


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

參考:張貼由斯特凡·馮·Chossy here

+0

還需要實現'moveRowAt:to:',否則不會顯示重新排序的控件。 – Matt 2016-12-15 23:17:25

9

解決方案我找到了解決辦法。 UITableViewCell拒絕繪製重新排序控件,除非它處於編輯模式。幸運的是,UITableViewCellUITableView分別進行了軌道編輯,關鍵的是,UITableView實際上處理重新排序而不管其自己的編輯模式。我們只需要欺騙單元格繪製重新排序控件,我們就是免費的。

子類UITableViewCell這樣的:

class ReorderTableViewCell: UITableViewCell { 

    override var showsReorderControl: Bool { 
     get { 
      return true // short-circuit to on 
     } 
     set { } 
    } 

    override func setEditing(editing: Bool, animated: Bool) { 
     if editing == false { 
      return // ignore any attempts to turn it off 
     } 

     super.setEditing(editing, animated: animated) 
    } 

} 

現在只需對要啓用重新排序細胞集editing = true。您可以使用-tableView:canMoveRowAtIndexPath:作爲條件。

在您的表視圖數據源:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 

    // Configure the cell... 
    : 

    cell.editing = self.tableView(tableView, canMoveRowAtIndexPath: indexPath) // conditionally enable reordering 

    return cell 
} 

唯一的缺點是,這是與表視圖allowsMultipleSelectionDuringEditing選項不兼容;編輯控件不正確地始終顯示。解決方法是僅在實際表格視圖編輯期間啓用多項選擇。

在表格視圖控制器:

override func setEditing(editing: Bool, animated: Bool) { 
    super.setEditing(editing, animated: animated) 

    self.tableView.allowsMultipleSelectionDuringEditing = editing // enable only during actual editing to avoid cosmetic problem 
} 

此外,在-viewDidLoad或故事板,的allowsMultipleSelectionDuringEditing的初始值設置爲false。

+0

此解決方案適用於我,謝謝! – sebastien 2016-08-28 13:45:15

+0

天才。已經通過10+ SO解決方案,這是唯一的工作。將來需要在未來的iOS版本中關注這一點,但在iOS 10.1上運行良好 – Tys 2017-03-13 12:41:13

相關問題