【问题标题】:NSTextField and NSTouchbarNSTextField 和 NSTouchbar
【发布时间】:2021-01-17 12:22:15
【问题描述】:

我正在实现触控栏功能。 我希望在编辑 NSTextField 时显示特定的触摸栏。

这两种方法我都试过了:

  • 使用touchbar 属性设置触摸栏:
field.touchBar = myTouchBar
  • 并继承 NSTextField 以覆盖 makeTouchBar() 函数:
class MyTextField: NSTextField
{
   override func makeTouchBar(){return myTouchBar}
}

两种方法在编辑字段时都会显示一个空的触摸栏。更改 isAutomaticTextCompletionEnabled 和 allowsCharacterPickerTouchBarItem 属性不会改变它 - 只是使相应的按钮出现。

使用NSTextView 或许多其他类型的NSView 执行完全相同的操作,但是效果非常好。

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

【问题讨论】:

标签: objective-c swift xcode macos cocoa


【解决方案1】:

感谢@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 被要求提供NSTextField 的NSTextView 时,然后使用NSTextField 的innerTouchBar 创建一个自定义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。因此,当这种情况发生时,在NSWindowController 的windowWillReturnFieldEditor(_:,to:) 中,我们必须返回一个带有正确触摸栏的自定义NSTextView。 我认为这可以适用于 touchBar 以外的其他东西...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2011-10-03
    相关资源
    最近更新 更多