我在做什么错?我没有收到此通知。我有这个功能:
@objc func onAutocorrection (_ notification: Foundation.Notification) {
Swift.print("\(notification)")
}
后来在同一课上,我确实按如下方式使用它:
NotificationCenter.default.addObserver(
self,
selector: #selector(onAutocorrection(_:)),
name: NSSpellChecker.didChangeAutomaticCapitalizationNotification,
object: nil)
执行addObserver
,但是即使应用程序使用NSTextView
大写也不会调用该函数。
为什么?提前非常感谢!
答案 0 :(得分:0)
我似乎误解了通知。当发生自动大写字母时,并不是要触发它,而是要在Mac的系统偏好设置发生变化时触发它。 请参阅有用的Willeke的评论,并查看Notification of autocorrect
为了获得对自动大写字母反应的预期结果,我是否在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”的范围的第一个单词的大写版本是否等于替换字符串的第一个单词。如果是的话,我将从结果列表中删除该结果/建议。