NSTableView 不会在编辑时更新值

NSTableView doesn't update values on edit

我的应用程序中有一个基于单元格的 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 中的值没有改变,它 returns 变为 1.1562。如果我再次进行编辑,我会得到...

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

我在事件链中遗漏了一些东西,该值正在进入字典但随后在某处被重置?

问题是 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]))
}