【问题标题】:make NSTextField in NSTableCellView firstResponder()在 NSTableCellView firstResponder() 中制作 NSTextField
【发布时间】:2018-08-25 21:27:55
【问题描述】:

对于那些不喜欢阅读 20 cmets 的人来寻找答案。这对我有用:

  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:

编辑3:

编辑4:

【问题讨论】:

  • 有人吗?会有很大帮助!

标签: swift macos nstableview nstextfield


【解决方案1】:

在'+'按钮的action方法的最后,添加行后做:

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

【讨论】:

  • 谢谢,我明白了。窗户是什么? xcode 还显示错误“'ViewController' 类型的值没有成员 'window'”
  • window 是表格视图所在的窗口。
  • 谢谢。它为添加行的单元格的文本字段提供了蓝色轮廓(就像您输入文本时一样),但光​​标丢失。单击一次(不是两次)后,光标出现。有什么想法吗?
  • 不,我不知道。如何添加或插入行?
  • 通过向数据源数组添加一个对象,然后重新加载表格视图。 reload 函数位于您为我编写的代码之前。我也试着把它放在后面,这并没有让我感到惊讶
【解决方案2】:

不要继承NSTextField。您可以直接在基于视图的表视图中创建文本字段作为第一响应者。

这很容易。

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

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

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

【讨论】:

  • 这不是和我的回答一样吗?
  • 基本上可以,但不需要所有可选绑定。代码不能崩溃,否则你犯了设计错误。此外,也不需要显式选择和调度块。默认情况下,表格视图中的文本字段接受第一响应者。由于封闭对象是一个窗口控制器,您可以从其view 获取窗口
  • 感谢您的回复。所以我理解并在tableView.reloadData()之后将您的代码添加到“+”按钮功能。现在它向我抛出“线程 1:致命错误:在展开可选值时意外发现 nil”,我完全不明白。抱歉没放手哈哈
  • 我们是在谈论基于视图的表格视图吗?
  • tableView.view(...) 为 nil
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多