在 NSTableCellView 中创建 NSTextField firstResponder()

make NSTextField in NSTableCellView firstResponder()

对于那些不喜欢阅读 20 条评论以寻找答案的人。这对我有用:

  1. tableView 是基于视图的,而不是基于单元格的(属性检查器)
  2. tableView.reloadData() 不够快。使用 insertRow(at[0]:withAnimation:.leftSlide) 代替工作正常
  3. 确保 NSTextField 和 NSTextFieldCell 都是可编辑的(属性检查器)

最终代码:

tableViewAlarms.insertRows(at: [0], withAnimation: .effectFade)

let keyView = tableViewAlarms.view(atColumn: 0, row: 0, makeIfNecessary: false) as! NSTableCellView

self.view.window!.makeFirstResponder(keyView.textField)

问题:

有一个问题。我被困了一段时间让我的 NSTableView 按照我想要的方式工作。我是初学者,使用 类、继承和视图给我带来了很多麻烦。

screenshot, the NSTextField is activated

您可以通过按“+”按钮向 NSTableView 添加一行。

第一个 tableColumn 中的 NSTextField 是可编辑的,双击时开始编辑

现在我希望在添加一行时自动激活第一列中的 NSTextField(显示光标,响应通过键盘输入的文本)。

到目前为止我已经尝试过:

class NSTextFieldSubClass: NSTextField {

    override func becomeFirstResponder() -> Bool {
        return true
    }

}

我还玩弄了单元格的绑定(或者准确地说是 NSTextField 本身),但是因为我真的不知道如何解决这些问题所以它无处可去

我认为要走的路:

创建单元格时将 NSTextField 设置为 firstResponder,但我不知道如何操作。非常感谢任何帮助!!

另外:当光标闪烁时,NSTextField 的状态究竟是如何调用的?

编辑:

至于子类,我试了这么多:

class NSTextFieldSubClass: NSTextField {

    override func becomeFirstResponder() -> Bool {
        return true
    }

}

编辑截图:

编辑2:

edit3:

edit4:

在“+”按钮的操作方法的末尾,添加行后执行:

DispatchQueue.main.async(execute: {
    // get the cell view
    let view = self.tableView.view(atColumn: 0, row: row, makeIfNecessary: false)
    if let cellView = view as? NSTableCellView {
        // get the text field
        if let textField = cellView.textField {
            // make the text field first responder
            if textField.acceptsFirstResponder {
                self.tableView.selectRowIndexes(IndexSet(integer:row), byExtendingSelection: false)
                self.tableView.window?.makeFirstResponder(textField)
            }
        }
    }
})

不要继承 NSTextField。您可以开箱即用地在基于 table 视图的视图第一响应者中创建文本字段。

很简单。

假设您知道 rowcolumn(在您的示例中,第 0 行和第 0 列)使用 view(atColumn: 0, row 获取 table 单元格视图并首先创建文本字段响应者。

let keyView = tableView.view(atColumn: 0, row: 0, makeIfNecessary: false) as! NSTableCellView
view.window!.makeFirstResponder(keyView.textField)

第二个插座是做什么用的?只需使用标准默认值 textField.