Objective c NSTextField和NSTouchbar

Objective c NSTextField和NSTouchbar,objective-c,swift,xcode,macos,cocoa,Objective C,Swift,Xcode,Macos,Cocoa,我正在实现触摸栏功能。 我希望在编辑NSTextField时显示特定的触摸栏 我尝试了两种方法: 使用touchbar属性设置触摸栏: field.touchBar=myTouchBar 和子类化NSTextField以覆盖makeTouchBar()函数: 类MyTextField:NSTextField { 重写func makeTouchBar(){return myTouchBar} } 编辑字段时,这两种方法都会显示空的触摸栏。更改isAutomaticTextComple

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

我尝试了两种方法:

  • 使用
    touchbar
    属性设置触摸栏:
field.touchBar=myTouchBar
  • 和子类化
    NSTextField
    以覆盖
    makeTouchBar()
    函数:
类MyTextField:NSTextField
{
重写func makeTouchBar(){return myTouchBar}
}
编辑字段时,这两种方法都会显示空的触摸栏。更改
isAutomaticTextCompletionEnabled
AllowCharacterPickerTouchBarItem
属性不会更改它-只会显示相应的按钮

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


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

感谢@Willeke的回答,我已经找到了解决方案。然而,这相当棘手:

  • 首先,子类
    NSTextField
    保留另一个
    NSTouchBar
类MyTextField:NSTextField
{
私人触摸栏:有吗?
var编辑器:NSText?
@可用(OSX 10.12.2,*)
func setTouchBar(touchBar:NSTouchBar?)
{
innerTouchBar=触摸栏
}
@可用(OSX 10.12.2,*)
func getTouchBar()->NSTouchBar?
{
innerTouchBar as?NSTouchBar
}
}
  • 然后,子类
    NSTextView
    使用提供的
    NSTouchBar
@可用(OSX 10.12.2,*)
类MyTextView:NSTextView
{
private var innerTouchBar:NSTouchBar?
便利初始化(触摸栏:NSTouchBar?)
{
self.init()
innerTouchBar=触摸栏
}
重写func makeTouchBar()->NSTouchBar?
{
内触板
}
}
  • 当要求
    NSWindowController
    获取
    NSTextField
    NSTextView
    时,使用
    NSTextField
    innerTouchBar
    创建自定义
    NSTextView
扩展MyWindowController { func windowWillReturnFieldEditor(u发送方:NSWindow,到客户端:任何?->任何? { 如果可用(OSX 10.12.2,*) { 如果let field=client as?MyTextField { 如果field.editor==nil { field.editor=SFTextView(触摸栏:field.getTouchBar()) field.editor?.isFieldEditor=true } 返回字段编辑器 } } 返回零; } }
  • 当然,不要忘记在XIB或代码中使用
    MyTextField
    而不是
    NSTextField
    ,并且在创建后第一件事就是调用
    setTouchBar(:)
    函数
解释 每个
NSTextField
都有一个底层
NSTextView
,它实际上是第一个响应者,以及显示其触摸栏的对象。我们无法直接从
NSTextField
访问底层
NSTextView
。相反,
NSTextField
要求
nwinowcontroller
使用哪个
NSTextView
。因此,当发生这种情况时,在
NSWindowController的
windowWillReturnFieldEditor(:,to:)
中,我们必须使用正确的触摸栏返回自定义
NSTextView

我认为这可以应用于触摸栏以外的其他事物…

NSTextField
不是第一响应者。看见