Как связать событие-переключатель NSTableCellView Checkbox с его источником данных?
Среда: представление на основе NSTableView БЕЗ привязок.
Проблема: сопоставление действия флажка столбца с источником данных
(т.е. как я узнаю, в какой строке произошло событие флажка, в режиме реального времени?).
Без использования привязок IB, как мне связать какое-либо конкретное действие NSButton/Checkbox в соответствующей строке NSTableView с его источником данных?
Я хочу иметь возможность обновлять соответствующий массив данных флажка с его состоянием пользовательского интерфейса (флажок -> 1 в источнике данных).
То есть сопоставление массива структур или замыканий с их записями таблицы 1:1. Следовательно, нажатие на кнопку "выбрать" / строку обновляет соответствующий логический флаг с массивом источника данных.
Следующий фрагмент кода показывает, как я заполняю пользовательский интерфейс:
typealias GeoTuple = (geoDesc:String,geoSelected:Int)
var geoList = [GeoTuple]()
func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
var cellView:NSTableCellView?
let cellID = tableColumn?.identifier
guard nil != cellID else {
cellView = NSTableCellView()
return cellView
}
cellView = (tableView.makeViewWithIdentifier(cellID!, owner: self) as? NSTableCellView)
guard nil != cellView else {
print("{ODYInitializePricingProductViewController} *** NO CELL VIEW GENERATED *** \n Check cell identifiers.")
return nil
}
let currentTableColumn = ODYInitPricingTableColumnIdentifier(rawValue:cellView!.identifier!)
switch currentTableColumn! {
...
case .geoSelectFlag:
if row < geoList.count {
if let selectButton = cellView?.viewWithTag(1) as? NSButton {
selectButton.integerValue = geoList[row].geoSelected
}
}
...
return cellView
}
Вопрос: Как перехватить конкретное событие переключения NSButton-Check и связать / сопоставить это событие с соответствующим источником данных: geoList?
2 ответа
Подключите цель кнопки-флажка к вашему делегату табличного представления и установите его действие на селектор какого-либо метода действия.
Вероятно, проще всего установить цель и действие программно в tableView(_:viewForTableColumn:row:)
, Поскольку иерархии представлений ячеек в столбцах таблицы на самом деле состоят из вспомогательных перьев, их соединение с объектами в сценах NIB или раскадровки может быть проблематичным.
В методе действия вы можете искать строку, вызывая rowForView()
на столе, передавая sender
который метод действия получает в качестве параметра. Вы также можете проверить отправителя state
чтобы определить, должно ли новое значение для вашей модели данных быть включено или выключено.
func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? { ...
...
case .geoSelectFlag:
if row < geoList.count {
if let selectButton = cellView?.viewWithTag(1) as? NSButton {
selectButton.integerValue = geoList[row].geoSelected
selectButton.target = self
selectButton.action = "checkBoxAction:"
}
}
...
}
func checkBoxAction(sender:NSButton) {
}
(lldb) po self.geoTableView.rowForView(sender) 3