Initiate Font
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 NSTextView
.
inputTextView.typingAttributes = [
.font : NSFont.userFont(ofSize: 17.0) ?? NSFont.systemFont(ofSize: 17.0),
.foregroundColor : NSColor.labelColor
]
Don't forget to set the
foregroundColor
as well, or you textview won't work with light/dark mode switching.
Undo
It is easy to turn on undo in Interface Builder. However, you should know that every time you set string
or 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
Both NSTextDelegate
and 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.