Reputation: 369
I followed this thread first: How to programmatically select a row in UITableView in Swift 1.2 (Xcode 6.4)
Which did help for the selection, but when I tap the screen to select another row, the previously (programmatically) set row will not trigger the deselect message. The cells that are selected naturally (by tapping the screen), do receive the deselect message.
I need that row that is programmatically selected to receive the deselect message (non-programmatically).
(I'm working in a UITableView subclass - so it's not a delegate, it's overrides).
My code:
if let selectedRow = viewModel.selectedRow {
defaultSelectedPath = IndexPath(row: selectedRow, section: 0)
if let defaultSelectedPath = defaultSelectedPath {
let selectedCell = self.tableView.cellForRow(at: defaultSelectedPath)
self.tableView.selectRow(at: defaultSelectedPath, animated: true, scrollPosition: .none)
self.tableView(self.tableView, didSelectRowAt: defaultSelectedPath)
selectedCell?.accessoryType = .checkmark
}
}
Hack Fix:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var cell = tableView.cellForRow(at: indexPath)
cell?.accessoryType = .checkmark
if let defaultSelectedPath = self.defaultSelectedPath {
if indexPath != defaultSelectedPath {
cell = tableView.cellForRow(at: defaultSelectedPath)
tableView.deselectRow(at: defaultSelectedPath, animated: false)
self.tableView(self.tableView, didDeselectRowAt: defaultSelectedPath)
cell?.accessoryType = .none
}
self.defaultSelectedPath = nil
}
}
Please tell me there's a better way to do this.
Upvotes: 0
Views: 982
Reputation: 11
you can use :-
self.clearsSelectionOnViewWillAppear = true
on viewDidLoad()
Upvotes: 1