Похоже, я неправильно понял уведомление.Он не должен запускаться, когда происходит автоматическая капитализация, но когда меняется системное предпочтение вашего Mac.См. Комментарий очень полезного Виллекса и см. Уведомление об автозамене
Чтобы получить ожидаемый результат реакции на автокапитализацию, я реализовал эту функцию в NSTextViewDelegate:
public func textView(_ view: NSTextView, didCheckTextIn range: NSRange, types checkingTypes: NSTextCheckingTypes, options: [NSSpellChecker.OptionKey : Any] = [:], results: [NSTextCheckingResult], orthography: NSOrthography, wordCount: Int) -> [NSTextCheckingResult] {
if !range.contains(0){
return results
}
var newResult = [NSTextCheckingResult]()
for result in results {
if let textToChange = view.string[range].components(separatedBy: " ").first, let replacement = result.replacementString?.components(separatedBy: " ").first {
let firstLetterCap = textToChange.capitalizingFirstLetter()
if replacement == firstLetterCap {
continue //don't add to results
}
}
newResult.append(result)
}
return newResult
}
Эта функция предотвратит использование заглавных букв первого символа.
В конечном счете, я проверяю, равна ли заглавная версия первого слова диапазона, который должен включать позицию «0», первому слову строки замены.И если это так, я удаляю этот результат / предложение из списка результатов.