You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:39:00