结合此处找到的 2 个答案,我能够为我找到解决方法,但有必要将NSTextField
,NSTextFieldCell
和NSTextView
.
斯威夫特 5
1.
Subclass NSTextView
,这是实际粘贴被拦截的地方,可以替换内容。
final class TextView: NSTextView {
override func paste(_ sender: Any?) {
var content = NSPasteboard.general.string(forType: .string) ?? ""
// modify content
NSPasteboard.general.clearContents()
NSPasteboard.general.setString(content, forType: .string)
super.paste(sender)
}
}
2.
子类化NSTextFieldCell
并fieldEditorFor
使用您自己的NSTextView
. 重要的是设置true
为.isFieldEditor
NSTextView
final class TextFieldCell: NSTextFieldCell {
private let textView = TextView()
required init(coder: NSCoder) {
super.init(coder: coder)
}
override init(textCell: String) {
super.init(textCell: textCell)
textView.isFieldEditor = true
}
override func fieldEditor(for: NSView) -> NSTextView? {
textView
}
}
3.
子类NSTextField
化并分配给cellClass
您自己的静态属性NSTextFieldCell
。NSTextFieldCell
如果您只是将自己的分配给 all ,则可以避免最后一步NSTextField
,即NSTextField.cellClass = yourCellClass
final class TextField: NSTextField {
required init?(coder: NSCoder) {
nil
}
init() {
TextField.cellClass = TextFieldCell.self
super.init(frame: .zero)
}
}