3

我试图在其窗口委托中访问 NSTextField 实例的复制、剪切和粘贴方法,以便我可以自定义这些方法。我发现与 tableViews 和 textViews 不同,文本字段的复制、粘贴和剪切操作在委托中没有响应。我的理解是所有文本控件都共享窗口的字段编辑器,但情况似乎并非如此。

我想也许 TextField 的字段编辑器没有与窗口委托共享,但是我做了一些测试,发现当我输入控件时,这些字段编辑器是相同的——非常奇怪。

我目前的解决方法是使用 NSTextView 的子类实例,其中复制和粘贴操作方法根据需要进行响应。然而,这有其自身的问题,我希望有一些方法可以让 NSTextFields 按预期工作。

4

2 回答 2

4

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)
    }

}

归功于:

如何在 NSTextField (Cocoa) 中单击鼠标右键禁用上下文菜单?

和指出现场编辑的 Ken Thomases。

于 2016-08-10T02:22:53.503 回答
-1

也许你可以看看 NSTextField 的:

- (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard type:(NSString *)type;
- (BOOL)readSelectionFromPasteboard:(NSPasteboard *)pboard type:(NSString *)type;

这将允许您拦截调用自定义响应。

于 2013-04-01T18:16:40.140 回答