Blocks: Useful to Perform Actions In Context
Something short and sweet I want to share with you because I love how it reads:
func refreshCell(rowIndexes rowIndexes: NSIndexSet,
columnIndexes: NSIndexSet) {
preservingSelection {
tableView.reloadDataForRowIndexes(rowIndexes, columnIndexes: columnIndexes)
}
}
restoringSelection
is a function that takes a block and performs whatever the block does while restoring the current selection in a table view (here: NSTableView
).
Here’s the implementation.
private func preservingSelection(@noescape block: () -> Void) {
let oldSelection = selection()
block()
selectCells(oldSelection)
}
typealias SelectedCells = (columns: NSIndexSet, rows: NSIndexSet)
private func selection() -> SelectedCells {
let selectedRows = tableView.selectedRowIndexes
let selectedColumns = tableView.selectedColumnIndexes
return (selectedColumns, selectedRows)
}
private func selectCells(selection: SelectedCells) {
tableView.selectRowIndexes(selection.rows, byExtendingSelection: false)
tableView.selectColumnIndexes(selection.columns, byExtendingSelection: false)
}
The resulting code from above reads so much nicer than querying selection()
first and restoring it afterwards. It communicates very clearly that some state from before will be preserved (or restored).
The little joys.