Как связать событие-переключатель 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

Другие вопросы по тегам