首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSTextField和NSTouchbar

NSTextField和NSTouchbar
EN

Stack Overflow用户
提问于 2020-10-01 18:19:04
回答 1查看 172关注 0票数 0

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

我尝试过这两种方法:

  • 使用touchbar属性设置触摸屏:

代码语言:javascript
复制
field.touchBar = myTouchBar

  • 和子类NSTextField以覆盖makeTouchBar()函数:

代码语言:javascript
复制
class MyTextField: NSTextField
{
   override func makeTouchBar(){return myTouchBar}
}

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-02 08:21:33

多亏了@Willeke的回答,我找到了解决办法。然而,这是相当棘手的:

  • First,子类NSTextField保持另一个NSTouchBar :

代码语言:javascript
复制
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 :

代码语言:javascript
复制
@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

F 223创建一个自定义NSTextView >

代码语言:javascript
复制
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的对象。我们不能直接从NSTextView访问底层NSTextField。相反,NSTextField要求NWindowController使用哪个NSTextView。因此,当发生这种情况时,在windowWillReturnFieldEditor(_:,to:) of NSWindowController中,我们必须返回带有正确touchBar的自定义NSTextView。我认为这可以适用于touchBar以外的其他事情.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64161123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档