【问题标题】:controlTextDidEndEditing gets called on NSTableView loadcontrolTextDidEndEditing 在 NSTableView 加载时被调用
【发布时间】:2018-07-29 19:12:46
【问题描述】:

我正在尝试将编辑单元格文本功能添加到基于视图的 NSTableView。我有一个具有name 属性的数据模型,我使用该类的数组作为myTableView 的数据源。要添加编辑功能,我已经实现了 controlTextDidEndEditing 方法,如下所示 -

override func controlTextDidEndEditing(_ obj: Notification)
    {
        guard let newName = (obj.object as? NSTextField)?.stringValue else {
            return
        }

        //Added for debugging purpose
        print(myTableView.selectedRow)

        //Update text value of the array item at selectedRow
        project[myTableView.selectedRow].name = newName
    }

这里的问题是 - 只要我运行我的应用程序并加载 myTableViewcontrolTextDidEndEditing 就会被解雇。由于最初没有选择,print(myTableView.selectedRow) 语句返回-1

当我尝试获取当前选定的单元格文本时,我收到此异常 Cannot pass a negative value for 'index',因为 selectedRow 最初是 -1

为什么在NSTableView 加载时会调用此方法?在基于NSTableView 的视图中具有编辑文本功能的最佳方式是什么?我想要实现的是一种在编辑结束时收到通知的方法,以便我可以在后端更新我的对象。我也尝试了NSNotificationCenter.addObserver 方法,但遇到了同样的问题。

【问题讨论】:

    标签: swift macos cocoa nstableview


    【解决方案1】:

    最有效的方法是 Cocoa Bindings。将文本字段的value 绑定到Cell View 的相应键路径(objectValue.name)。

    没有额外的代码。所有绑定的属性都与 UI 元素同步。

    【讨论】:

    • 我尝试了 Cocoa 绑定,发现它们足够复杂,我可以实现。我也遵循 MVVM 设计模式,它可能不适用于 Cocoa 绑定。我想要的是一种在文本编辑结束时得到通知的方法,以便我可以更新数据库中的对象值。 controlTextDidEndEditing 在初始加载时被触发,我不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多