NSTextField 和 NSTouchbar

NSTextField and NSTouchbar

我正在实现触摸栏功能。 我希望在编辑 NSTextField.

时显示特定的触摸栏

两种方法我都试过了:

field.touchBar = myTouchBar
class MyTextField: NSTextField
{
   override func makeTouchBar(){return myTouchBar}
}

这两种方法在编辑字段时都显示空触摸栏。更改 isAutomaticTextCompletionEnabledallowsCharacterPickerTouchBarItem 属性不会更改它 - 只会显示相应的按钮。

NSTextView 或许多其他类型的 NSView 做完全相同的事情,但是效果非常好。

您知道编辑 NSTextField 时是否可以使用自定义工具栏吗?

感谢@Willeke 的回答,我找到了解决方案。然而,这非常棘手:

  • 首先,子类 NSTextField 以保留另一个 NSTouchBar :
class MyTextField: NSTextField
{
    private var innerTouchBar: Any?
    var editor: NSText?

    @available(OSX 10.12.2, *)
    func setTouchBar(_ touchBar: NSTouchBar?)
    {
        innerTouchBar = touchBar
    }

    @available(OSX 10.12.2, *)
    func getTouchBar() -> NSTouchBar?
    {
        innerTouchBar as? NSTouchBar
    }
}
  • 然后,子类 NSTextView 使用提供的 NSTouchBar :
@available(OSX 10.12.2, *)
class MyTextView: NSTextView
{
    private var innerTouchBar: NSTouchBar?

    convenience init(touchBar: NSTouchBar?)
    {
        self.init()
        innerTouchBar = touchBar
    }

    override func makeTouchBar() -> NSTouchBar?
    {
        innerTouchBar
    }
}
  • NSWindowController 被要求提供 NSTextFieldNSTextView 时,然后使用 NSTextFieldinnerTouchBar 创建自定义 NSTextView =]:
extension MyWindowController
{
    func windowWillReturnFieldEditor(_ sender: NSWindow, to client: Any?) -> Any?
    {
        if #available(OSX 10.12.2, *)
        {
             if let field = client as? MyTextField
            {
                if field.editor == nil
                {
                    field.editor = SFTextView(touchBar: field.getTouchBar())
                    field.editor?.isFieldEditor = true
                }
                return field.editor
            }
        }
        return nil;
    }
}
  • 当然,不要忘记在 XIB 或您的代码中使用 MyTextField 而不是 NSTextField,并且在创建后第一件事就是调用 setTouchBar(_:) 函数。

解释

每个NSTextField都有一个底层的NSTextView,其实就是firstResponder,显示touchBar的对象。我们无法直接从 NSTextField 访问基础 NSTextView。相反,NSTextField 询问 NWindowController 使用哪个 NSTextView。因此,当发生这种情况时,在 NSWindowControllerwindowWillReturnFieldEditor(_:,to:) 中,我们必须 return 具有正确触摸条的自定义 NSTextView。 我认为这可以适用于 touchBar 以外的其他东西...