问题
I can see this behavior in both deprecated UITableViewRowAction class and UISwipeActionsConfiguration class:
If you have allowsMultipleSelection property set to true and, let's say, you have 3 rows selected:
When you start swiping any row in the table for a RowAction the previously selected rows -- all 3 of them -- become unhighlighted, and the property indexPathsForSelectedRows drops to nil.
- Does this behavior make sense?
- Is there any 'deselecting' callback (because I'm displaying the number of selected rows)
- What are possible workarounds to persist the array of selected rows?
回答1:
UITableView enters editing mode when you swipe a row in the table. This is your
'deselecting' callback
You can backup your selected rows on entering the mode and restore on exiting:
class ViewController: UITableViewController {
var indexPathsForSelectedRows: [IndexPath]?
override func setEditing(_ editing: Bool, animated: Bool) {
if editing {
indexPathsForSelectedRows = tableView.indexPathsForSelectedRows
} else {
indexPathsForSelectedRows?.forEach { tableView.selectRow(at: $0, animated: false, scrollPosition: .none) }
}
super.setEditing(editing, animated: animated)
}
}
Also note that if you re-arrange/delete/insert rows during editing, you'll need to update your stored indexPathsForSelectedRows accordingly so you restore correct index paths.
来源:https://stackoverflow.com/questions/57275337/uitableview-swiping-rowaction-cancels-the-selected-rows