在 NSTableCellView 中创建 NSTextField firstResponder()
make NSTextField in NSTableCellView firstResponder()
对于那些不喜欢阅读 20 条评论以寻找答案的人。这对我有用:
- tableView 是基于视图的,而不是基于单元格的(属性检查器)
- tableView.reloadData() 不够快。使用 insertRow(at[0]:withAnimation:.leftSlide) 代替工作正常
- 确保 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 视图的视图第一响应者中创建文本字段。
很简单。
假设您知道 row
和 column
(在您的示例中,第 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
.
对于那些不喜欢阅读 20 条评论以寻找答案的人。这对我有用:
- tableView 是基于视图的,而不是基于单元格的(属性检查器)
- tableView.reloadData() 不够快。使用 insertRow(at[0]:withAnimation:.leftSlide) 代替工作正常
- 确保 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 视图的视图第一响应者中创建文本字段。
很简单。
假设您知道 row
和 column
(在您的示例中,第 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
.