didChangeAutomaticCapitalizationNotification не вызвано - PullRequest
0 голосов
/ 23 ноября 2018

Что я делаю не так?Я не получаю это уведомление.У меня есть эта функция:

 @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 голосов
/ 24 ноября 2018

Похоже, я неправильно понял уведомление.Он не должен запускаться, когда происходит автоматическая капитализация, но когда меняется системное предпочтение вашего 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», первому слову строки замены.И если это так, я удаляю этот результат / предложение из списка результатов.

...