0

环境:基于视图的 NSTableView 没有绑定。
问题:将列的复选框操作映射到其数据源
(即,我如何实时知道复选框事件发生在哪一行?)。

在不使用 IB 绑定的情况下,如何将其各自 NSTableView 行中的任何特定 NSButton/Checkbox 操作与其数据源相关联?

在此处输入图像描述

我希望能够使用其 UI 状态更新复选框的相应数据数组(选中框-> 数据源中的 1)。

也就是说,将结构或闭包的数组与它们的 1:1 表条目进行映射。因此,单击“选择”/行会使用数据源数组更新其各自的布尔标志。

以下代码片段显示了我如何填充 UI:

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?

4

2 回答 2

1

将复选框按钮的目标连接到您的表格视图委托,并将其操作设置为某些操作方法的选择器。

以编程方式在tableView(_:viewForTableColumn:row:). 因为表格列中的单元格视图层次结构实际上位于子 nib 中,所以将它们连接到 NIB 或情节提要场景中的对象可能会出现问题。

rowForView()在 action 方法中,您可以通过调用table来查找行,并将senderaction 方法接收的作为参数传递。您还可以检查发件人state以确定您的数据模型的新值是打开还是关闭。

于 2016-01-07T21:09:58.737 回答
0
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

于 2016-01-07T21:59:54.577 回答