didChangeAutomaticCapitalizationNotification not triggered



我做错了什么?我没有收到这个通知。我有这个功能:

@objc func onAutocorrection (_ notification: Foundation.Notification) {
Swift.print("(notification)")
}

稍后在同一个类中,我使用它如下:

NotificationCenter.default.addObserver(
self, 
selector: #selector(onAutocorrection(_:)), 
name: NSSpellChecker.didChangeAutomaticCapitalizationNotification,
object: nil)

执行addObserver,但即使应用程序在NSTextView中大写,也从不调用该函数。

为什么?非常感谢!

看起来我误解了通知。它不是在自动资本化发生时触发的,而是在Mac的系统偏好发生变化时触发的。请参阅Willeke的评论,并参阅自动更正的通知

为了达到对自动资本化做出反应的预期结果,我在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"的范围中第一个单词的大写版本是否等于替换字符串的第一个单词。如果是,那么我将从结果列表中删除该结果/建议。

最新更新