NSTableView:直接编辑文本字段而不突出显示整行

Posted

技术标签:

【中文标题】NSTableView:直接编辑文本字段而不突出显示整行【英文标题】:NSTableView: Directly editing a textfield without highlighting the whole row 【发布时间】:2021-11-11 15:08:02 【问题描述】:

我在TableView 中有一个NSTextfield。内容模式配置为ViewBased。所以我有类型:NSTableCellView

我的表格视图示例:

我的问题是在选择行之前我无法编辑。但是,我想独立于行单击文本字段并直接编辑而不选择整行。

当前解决方案:在Table View中,我目前可以将突出显示设置为None,然后直接编辑工作,但是当我点击行中的Textfield外部时,我仍然希望能够选择整行.

如果有人可以帮助我,我会非常高兴。非常感谢!

【问题讨论】:

【参考方案1】:

免责声明 - 这是在 here 的好回答之后改编的。

一种可能的方法是继承NSTableView 并覆盖hitTest,以便将用户交互事件直接发送到文本字段而不是单元格视图:

override func hitTest(_ point: NSPoint) -> NSView? 
    let myPoint = superview!.convert(point, to: self)
    let column = self.column(at: myPoint)
    let row = self.row(at: myPoint)

    // if we find an editable text field at this point, we return it instead of the cell
    // this will prevent any cell reaction
    if row >= 0, column >= 0,
        let cell = view(atColumn: column, row: row, makeIfNecessary: false),
        let textField = cell.hitTest(convert(myPoint, to: cell.superview)) as? NSTextField,
        textField.isEditable 
        return textField
     else 
        return super.hitTest(point)
    

【讨论】:

非常感谢,您解决了我的问题!但是现在我遇到的问题是文本字段的可点击区域比可见区域更下方。 hitTestpoint 参数位于视图的父视图的坐标系中,而不是视图本身的坐标系中。 column(at:)row(at:) 期望在 table view 的坐标系中有一个点。 是的,@Willeke 你是对的。实际上转换功能应该可以解决问题,但它不能正常工作。所以你必须用鼠标再往下一点,然后它才能工作。如果我只使用点,那么我只会得到文本字段中的第一个条目。对于第二个条目,它根本不起作用。我认为,如果您修改转换功能或提供替代方案,它应该可以正常工作。 @Willeke 对,不知道我怎么错过了,谢谢,更新了答案。 @Fatih 根据 Willeke 的评论更新了答案,使用每个单元格的两个文本字段运行一些测试,并按预期选择字段。

以上是关于NSTableView:直接编辑文本字段而不突出显示整行的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在文本字段中输入数据而不给予webelement

三星 Galaxy Tab 中的 Sencha touch Textfield 突出显示行为

可可:核心数据 + NSTableView

如何编辑 alertViewController 而不根据操作将其关闭

OSX 基于视图的 NSTableView 字体更改

NSTableview 中选定行的标签颜色