我有一個UITableView,我希望能夠在不處於編輯模式時對行進行重新排序,這意味着我不想看到刪除圖標,直到按Edit。我希望能夠始終查看和使用重新排序的控件。那可能嗎?在不處於編輯模式時重新排序UITableView上的控件?
我是否必須始終保持UITableView處於編輯模式並手動啓用/禁用刪除圖標?如何在這種情況下禁用滑動刪除?
我有一個UITableView,我希望能夠在不處於編輯模式時對行進行重新排序,這意味着我不想看到刪除圖標,直到按Edit。我希望能夠始終查看和使用重新排序的控件。那可能嗎?在不處於編輯模式時重新排序UITableView上的控件?
我是否必須始終保持UITableView處於編輯模式並手動啓用/禁用刪除圖標?如何在這種情況下禁用滑動刪除?
據我所知,你不能只使用編輯標誌。但是,獲得類似效果並不困難。
有自己的布爾值,即deleting
。將表格單元格設置爲cell.showsReorderControl = YES
。 然後執行移動單元格所需的所有方法。我認爲你正在尋找的代碼是。如果deleting == YES
返回UITableViewCellEditingStyleDelete
,否則返回UITableViewCellEditingStyleNone
。 最後,總是設置tableView.editing = YES
。如果在更改deleting
布爾之前和之後運行[tableView beginUpdates]
和[tableView endUpdates]
一切都應該正常工作。讓我知道如果這沒有意義,我會再試一次。
沒有刪除和沒有縮進的重新排序。
- (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
還需要實現'moveRowAt:to:',否則不會顯示重新排序的控件。 – Matt 2016-12-15 23:17:25
解決方案我找到了解決辦法。 UITableViewCell
拒絕繪製重新排序控件,除非它處於編輯模式。幸運的是,UITableViewCell
和UITableView
分別進行了軌道編輯,關鍵的是,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。
爲每個單元格設置UITableViewCellEditingStyle標誌並實現canMoveRowAtIndexPath和canEditRowAtIndexPath UITableViewDataSource委託方法。不確定您是否必須永久處於編輯模式才能執行此操作。通過這種方式,將停止滑動刪除 – TheBlack 2011-05-23 13:58:33