基于Cell的NSTableView可编辑单元格修改不生效、IBAction无响应如何解决?
NSTableView可编辑单元格修改不生效、Action不触发问题
我使用的是基于Cell的NSTableView,其中两列需要支持编辑功能。已将对应两列及其TextCells设置为可编辑状态,且将Action属性配置为“Sent on End Editing”,随后尝试将TextCells关联到ViewController中的@IBAction方法。
运行项目后,单元格看起来支持编辑,但按下回车键确认修改后,修改内容不会同步展示在单元格中,同时关联的@IBAction方法也完全没有触发。
已实现的正常展示数据的相关代码
func numberOfRows(in tableView: NSTableView) -> Int { var numRows : Int = 0 if tableView.identifier?.rawValue == "xml" { numRows = xmls.count } return numRows } func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? { var cell : String = "" if tableView.identifier?.rawValue == "xml" { if tableColumn?.identifier.rawValue == "xml" { cell = xmls[row].lastPathComponent } if tableColumn?.identifier.rawValue == "pn" { cell = pn[row] } if tableColumn?.identifier.rawValue == "init" { cell = init[row] } if tableColumn?.identifier.rawValue == "dn" { cell = dn[row] } } return cell }
未触发的编辑监听方法
@IBAction func deviceNumberCellWasEdited(_ sender: Any) { print("cell was edited") }
补充说明
已在Storyboard中将单元格的Behavior属性设置为Editable,Action属性设置为Sent on End Editing,配置截图如下:
问题原因
基于Cell的NSTableView要支持编辑功能,仅在Storyboard设置可编辑属性是不够的,必须实现NSTableViewDataSource协议中的tableView(_:setObjectValue:for:row:)方法。编辑完成后系统会调用该方法将修改后的值回传给数据源,未实现该方法时,修改后的内容没有写入数据源,TableView重新渲染时仍展示旧数据,同时编辑相关的Action事件也不会触发。
解决方案
实现setObjectValue代理方法,在方法内将修改后的值更新到对应的数据源数组即可,完整实现代码如下:
func numberOfRows(in tableView: NSTableView) -> Int { var numRows : Int = 0 if tableView.identifier?.rawValue == "xml" { numRows = xmls.count } return numRows } func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? { var cell : String = "" if tableView.identifier?.rawValue == "xml" { if tableColumn?.identifier.rawValue == "xml" { cell = xmls[row].lastPathComponent } if tableColumn?.identifier.rawValue == "pn" { cell = pn[row] } if tableColumn?.identifier.rawValue == "init" { cell = init[row] } if tableColumn?.identifier.rawValue == "dn" { cell = dn[row] } } return cell } func tableView(_ tableView: NSTableView, setObjectValue object: Any?, for tableColumn: NSTableColumn?, row: Int) { if tableColumn?.identifier.rawValue == "dn" { dn[row] = object as! String } if tableColumn?.identifier.rawValue == "init" { init[row] = object as! String } }
内容的提问来源于stack exchange,提问作者psb
相关产品推荐
相关产品推荐

