我的应用程序中有一个基于单元格的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)
我在事件链中遗漏了一些东西,价值是进入了字典,但随后又被重置了?
答案 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]))
}