我正在实现触摸屏功能。我希望在编辑NSTextField时显示一个特定的触摸屏。
我尝试过这两种方法:
touchbar属性设置触摸屏:field.touchBar = myTouchBarNSTextField以覆盖makeTouchBar()函数:class MyTextField: NSTextField
{
override func makeTouchBar(){return myTouchBar}
}在编辑字段时,这两种方法都显示为空的触摸屏。更改isAutomaticTextCompletionEnabled和allowsCharacterPickerTouchBarItem属性并不会改变它--只会出现相应的按钮。
但是,对NSTextView或许多其他类型的NSView做同样的事情,效果非常好。
您知道在编辑NSTextField时是否可以使用自定义工具栏
发布于 2020-10-02 08:21:33
多亏了@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:F 223创建一个自定义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;
}
}当然,
MyTextField而不是NSTextField,并在创建后首先调用setTouchBar(_:)函数。解释
每个NSTextField都有一个底层NSTextView (实际上是firstResponder ),以及显示touchBar的对象。我们不能直接从NSTextView访问底层NSTextField。相反,NSTextField要求NWindowController使用哪个NSTextView。因此,当发生这种情况时,在windowWillReturnFieldEditor(_:,to:) of NSWindowController中,我们必须返回带有正确touchBar的自定义NSTextView。我认为这可以适用于touchBar以外的其他事情.
https://stackoverflow.com/questions/64161123
复制相似问题