在NSTableCellView firstResponder()中创建NSTextField

时间:2018-03-16 18:09:16

标签: swift macos nstableview nstextfield

对于那些没有阅读20条评论来寻找答案的人。这对我有用:

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

    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成为第一个响应者,但我不知道如何。非常感谢任何帮助!!

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

    编辑:

    至于子类,这是我尝试过的所有内容:

    class NSTextFieldSubClass: NSTextField {
    
        override func becomeFirstResponder() -> Bool {
            return true
        }
    
    }
    

    编辑屏幕截图:

    these are the connections

    EDIT2:

    edit2: attributes inspector tableView

    EDIT3:

    edit3: bindings NSTextField

    edit4:

    edit4: error

2 个答案:

答案 0 :(得分:1)

在“+”按钮的操作方法结束时,添加行do:

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)
            }
        }
    }
})

答案 1 :(得分:1)

不要继承NSTextField。您可以在基于视图的表视图中使文本字段成为开箱即用的第一响应者。

这很简单。

假设您知道rowcolumn(在您的示例中第0行和第0列)获取带有view(atColumn: 0, row的表格单元格视图,并使文本字段成为第一响应者。

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

第二个出口是什么?只需使用标准默认textField