我做错了什么?我没有收到这个通知。我有这个功能:
@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"的范围中第一个单词的大写版本是否等于替换字符串的第一个单词。如果是,那么我将从结果列表中删除该结果/建议。