我查找了标题中列出的所有3个功能的问题的帖子,但我的问题不在任何地方讨论。坦率地说,我的问题是它无视逻辑恕我直言。
在基于视图的NSTableView
中选择行时,我想在我的上一个(又名“操作”)列中显示“保存”按钮。所以在viewDidLoad()
我创建了我的孤儿按钮。然后在tableViewSelectionDidChange()
上将其从超级视图中删除,并将其添加到我的列NSTableCellView
。如果没有选择行,则无法显示任何按钮。简单。下面的代码完美无缺。
func tableViewSelectionDidChange(_ notification: Notification) {
let selectedRow = tableView.selectedRow
btnSave!.removeFromSuperview()
if selectedRow > -1,
let rowView = rowView(selectedRow),
let actionView = rowView.view(atColumn: Column.action.hashValue) as? NSTableCellView {
actionView.addSubview(btnSave!)
}
}
等待。我说完美吗?只要我使用鼠标来更改所选行,它就会起作用,包括在表格的最后一行下方选择,这将删除选择和前一个选定行中的任何按钮。但是,当我使用键盘上/下键更改选择时,它不起作用。
首先,我认为只有在使用鼠标更改行选择时才会调用该函数。然而,事实并非如此。根据文档和事实,tableViewSelectionIsChanging
都是如此。但是对于tableViewSelectionDidChange
文档,并没有说它仅在使用鼠标时才有效,事实证明了这一点。我把print语句和函数调用了。我也通过了调试器。令人难以置信的部分是 - 从superview工作中删除按钮的方法,但是添加按钮作为子视图的方法不起作用 - 并且仅当我使用键盘时。如何执行相同的确切代码但我得到两个不同的结果?
添加剩余功能
我用它来获取选定的行
private func rowView(_ rowIndex: Int, _ make: Bool = false) -> NSTableRowView? {
return tableView.rowView(atRow: rowIndex, makeIfNecessary: make)
}
我在viewDidLoad中调用它来创建我的孤儿按钮
private func createButton() {
btnSave = NSButton(frame: NSRect(x: 10, y: 0, width: 22, height: 16))
btnSave?.title = "S"
btnSave?.setButtonType(.momentaryPushIn)
btnSave?.bezelStyle = .roundRect
}