didChangeAutomaticCapitalizationNotification未触发

时间:2018-11-23 19:30:22

标签: cocoa nstextview

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

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

后来在同一课上,我确实按如下方式使用它:

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

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

为什么?提前非常感谢!

1 个答案:

答案 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”的范围的第一个单词的大写版本是否等于替换字符串的第一个单词。如果是的话,我将从结果列表中删除该结果/建议。