Unlike UITextView, you cannot assign font in NSTextView with empty string in Interface Builder. There are many ways to set the font, like to set the font of NSTextView.textStorage.font or set the attributedString of NSTextView.textStorage or just set the attributes. However, those methods are all imperfect.
Working With Input Method
The answers above are all not working with input method. The cursor indicator will still be the unset font's style and the font only applied when you have finished inputing.
The only correct way is to set the
typingAttributes property of
inputTextView.typingAttributes = [ .font : NSFont.userFont(ofSize: 17.0) ?? NSFont.systemFont(ofSize: 17.0), .foregroundColor : NSColor.labelColor ]
Don't forget to set the
foregroundColoras well, or you textview won't work with light/dark mode switching.
It is easy to turn on undo in Interface Builder. However, you should know that every time you set
attributedString property, the undo operations are clear.
You may notice that if the textview is in a modal window, its view controller is presented by
presentAsModalWindow(_:), the undo operations will not work as expected.
NSTextDelegate And NSTextStorageDelegate
NSTextStorageDelegate work with
NSTextView, however there are slightly differences between those functions.
// NSTextDelegate func textDidBeginEditing(_ notification: Notification) // only runs once when a user first starts editing. func textDidChange(_ notification: Notification) // only runs when a user edits in the textview. // NSTextStorageDelegate textStorage(_ textStorage: NSTextStorage, willProcessEditing editedMask: NSTextStorageEditActions, range editedRange: NSRange, changeInLength delta: Int) // and func textStorage(_ textStorage: NSTextStorage, didProcessEditing editedMask: NSTextStorageEditActions, range editedRange: NSRange, changeInLength delta: Int) // runs every time a user edits, also runs when the developer sets string property in code.
Mixing Fonts Causing the Whole Line Moves
This issue happens when using texts with emoji or texts in different languages. Both TextEdit.app and Pages.app have this issue. Changing text size over 22 may solve this issue. There is no other method to solve this issue yet.