NSTextField 和 NSTouchbar
NSTextField and NSTouchbar
我正在实现触摸栏功能。
我希望在编辑 NSTextField
.
时显示特定的触摸栏
两种方法我都试过了:
- 使用
touchbar
属性 设置触控栏:
field.touchBar = myTouchBar
- 和子类化
NSTextField
以覆盖 makeTouchBar()
函数:
class MyTextField: NSTextField
{
override func makeTouchBar(){return myTouchBar}
}
这两种方法在编辑字段时都显示空触摸栏。更改 isAutomaticTextCompletionEnabled
和 allowsCharacterPickerTouchBarItem
属性不会更改它 - 只会显示相应的按钮。
用 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
被要求提供 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:)
中,我们必须 return 具有正确触摸条的自定义 NSTextView
。
我认为这可以适用于 touchBar 以外的其他东西...
我正在实现触摸栏功能。
我希望在编辑 NSTextField
.
两种方法我都试过了:
- 使用
touchbar
属性 设置触控栏:
field.touchBar = myTouchBar
- 和子类化
NSTextField
以覆盖makeTouchBar()
函数:
class MyTextField: NSTextField
{
override func makeTouchBar(){return myTouchBar}
}
这两种方法在编辑字段时都显示空触摸栏。更改 isAutomaticTextCompletionEnabled
和 allowsCharacterPickerTouchBarItem
属性不会更改它 - 只会显示相应的按钮。
用 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
被要求提供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:)
中,我们必须 return 具有正确触摸条的自定义 NSTextView
。
我认为这可以适用于 touchBar 以外的其他东西...