NSTableView在编辑时不会更新值

时间:2015-12-20 16:22:54

标签: swift nstableview

我的应用程序中有一个基于单元格的NSTableView,绑定到[String,NSNumber]数组。我在IB中打开了编辑并添加了委托方法:

func tableView(tableView: NSTableView, setObjectValue anObject: AnyObject?, forTableColumn tableColumn: NSTableColumn?, row rowIndex: Int) {
    guard var d = deck?.geometryCards[rowIndex].data else { return }
    guard let i = tableColumn?.identifier where i.length > 0 else { return }
    let key = i.substring(0, length:(i.length - "Column".length))

    print("before setting " + String(d[key]))

    if key[0] == "F" {
        d[key] = NSNumber(double: Double((anObject as? String)!)!)
    } else if key[0] == "I" {
        d[key] = NSNumber(int: Int32((anObject as? String)!)!)
    }

    print("after setting " + String(d[key]))
}

当我点击单元格并更改其值时,我看到......

before setting Optional(-1.1562)
after setting Optional(5.5)

出色!唯一的问题是NSTableView中的值没有变化,它返回到1.1562。如果我再次进行编辑,我会...

before setting Optional(-1.1562)
after setting Optional(5.5)

我在事件链中遗漏了一些东西,价值是进入了字典,但随后又被重置了?

1 个答案:

答案 0 :(得分:1)

问题是Swift词典是值类型。将字典分配给另一个变量时,您将获得一个副本。您的变量d是字典的副本,而不是原始字典的副本。所以你要修改副本,而不是原始字典。

如果geometryCards中的卡片是对象而不是结构,那么这应该有效:

func tableView(tableView: NSTableView, setObjectValue anObject: AnyObject?, forTableColumn tableColumn: NSTableColumn?, row rowIndex: Int) {
    guard let c = deck?.geometryCards[rowIndex] else { return }
    guard let i = tableColumn?.identifier where i.length > 0 else { return }
    let key = i.substring(0, length:(i.length - "Column".length))

    print("before setting " + String(c.data[key]))

    if key[0] == "F" {
        c.data[key] = NSNumber(double: Double((anObject as? String)!)!)
    } else if key[0] == "I" {
        c.data[key] = NSNumber(int: Int32((anObject as? String)!)!)
    }

    print("after setting " + String(c.data[key]))
}