NSTextField:公开其复制和粘贴方法
Posted
技术标签:
【中文标题】NSTextField:公开其复制和粘贴方法【英文标题】:NSTextField: exposing its Copy and Paste methods 【发布时间】:2013-04-01 18:10:38 【问题描述】:我正在尝试在其窗口委托中访问 NSTextField 实例的复制、剪切和粘贴方法,以便我可以自定义这些方法。我发现与 tableViews 和 textViews 不同,文本字段的复制、粘贴和剪切操作在委托中没有响应。我的理解是所有文本控件都共享窗口的字段编辑器,但似乎并非如此。
我想也许 TextField 的字段编辑器没有与窗口委托共享,但是我做了一些测试,发现当我在控件中输入时,这些字段编辑器是相同的——非常奇怪。
我目前的解决方法是使用 NSTextView 的子类实例,其中复制和粘贴操作方法根据需要进行响应。然而,这有其自身的问题,我希望有一些方法可以让 NSTextFields 按预期工作。
【问题讨论】:
你可以继承 NSTextField 并接管几个方法吗? 谢谢Jean,我已经尝试过了,但无济于事。就像使用窗口的委托一样,这些操作方法没有响应。 【参考方案1】:nstextfield 没有复制和粘贴功能。这些只能在 nstextview 中找到。问题是,当编辑文本字段时,它会在编辑过程中打开一个名为 fieldeditor 的文本视图,并将其设置为第一响应者。
如何解决:
每个文本字段都有一个作为子单元的单元格连接到它(在图片中称为cell
,但应该更恰当地命名,例如CustomTextEditor
):
单元格有一个实现自定义字段编辑器的方法,称为fieldEditorForView
:
class cell: NSTextFieldCell
var editor: NSTextView
override func fieldEditorForView(aControlView: NSView) -> NSTextView?
if editor == nil
editor = ESPasteView()
return editor
上面的这个函数允许你提供你自己的自定义NSTextView
子类:
class ESPasteView: NSTextView, NSTextViewDelegate
override func paste(sender: AnyObject?)
Swift.print("user tries to paste")
super.pasteAsPlainText(nil)
归功于:
How to disable context menus with right mouse click in an NSTextField (Cocoa)?
还有 Ken Thomases 指出了字段编辑器。
【讨论】:
谢谢,当从NSTextField
复制时,我使用此技术自定义复制到粘贴板的文本。我重写了字段编辑器的copy(_:)
方法,并在重写的实现中手动在粘贴板上设置了自定义文本。
应该考虑到方法:fieldEditor(for controlView: NSView)
会被多次调用,所以最好存储对NSTextView
的引用,避免每次都创建一个新实例。【参考方案2】:
也许你可以看看 NSTextField 的:
- (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard type:(NSString *)type;
- (BOOL)readSelectionFromPasteboard:(NSPasteboard *)pboard type:(NSString *)type;
这将允许您拦截调用自定义响应。
【讨论】:
再次感谢琼。我不确定这些方法对 NSTextField 是否有效,尽管我看到它们为 NSTextView 列出。尽管如此,我还是会测试它们,除了自定义复制方法的原因是执行 coreData 实体的深层复制。我确信文本编辑器只会为粘贴板提供一个字符串——而不是我所追求的对象 ID。 @Antony 我从来没有使用过它们,但是两个选择器都被定义为一个 NSObject 类别NSObject(NSServicesRequests)
。此外,建议的解决方案似乎适用于 this thread 的 OP。
Jean,感谢您的坚持:我忽略了您建议的方法应用于 NSObject 类。然而,我无法让这些方法在我的 NSTextField 子类或委托中工作。我的失败可能是由于没有正确实现服务协议。在任何情况下,必须提供服务来调解 NSTextField 的复制和粘贴方法对我来说似乎相当沉重。
视情况而定。您在寻找什么样的定制?
我认为服务是为了提供与其他应用程序的交互。我正在尝试提供一种通过我自己的应用程序中的 coredata 对象的深层副本移动数据的方法。换句话说,我希望用户能够在代表数据图的 NSTextField 中复制一个句子,这样当它粘贴到我的应用程序的其他位置时,就会在该新位置生成基础数据图。我知道我可以通过将 NSManagedObjectID 复制到粘贴板来做到这一点。以上是关于NSTextField:公开其复制和粘贴方法的主要内容,如果未能解决你的问题,请参考以下文章