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:公开其复制和粘贴方法的主要内容,如果未能解决你的问题,请参考以下文章

demo:复制粘贴功能

NSTextField isFirstResponder

如何把Tex格式的文件转化为Word 格式

点击复制文本 ctrl+v粘贴

在反应应用程序中保护 Firebase API 密钥以使其无法公开访问的最佳方法是啥? [复制]

如何在 Navicat 复制和粘贴数据