TIL: How to Make NSTextView Reject Newlines
Today I learned that a NSWindow
’s field editor cannot trivially be set to “single line mode.” A field editor is a NSText
subclass like NSTextView
, but NSTextField
is only a configurable widget that uses the field editor.
How does the “single line mode” setting do what it does? I have no clue.
So how do you make custom field editor classes reject newlines both through pressing return, alt-return, and pasting text with newline characters? You override its NSResponder
hooks!
class CustomFieldEditor: NSTextView {
// ... imagine some relevant customizations here ...
override func insertNewline(sender: AnyObject?) {
// consume and discard
}
override func insertNewlineIgnoringFieldEditor(sender: AnyObject?) {
// consume and discard
}
override func paste(sender: AnyObject?) {
let pasteboard = NSPasteboard.generalPasteboard()
guard let pasteboardItem = pasteboard.pasteboardItems?.first,
text = pasteboardItem.stringForType(ContentTypes.text)
else { return }
let cleanText = text.stringByReplacingOccurrencesOfString("\n", withString: " ")
self.insertText(cleanText)
}
}
enum ContentTypes {
static let text = "public.utf8-plain-text"
}