Распознавание ключевого события во всем окне

Я работаю над приложением транслитерации, которое получает некоторый текст из NSTextView и транслитерирует его и помещает в другой NSTextView, что я хочу сделать, так как пользователь печатает предложение, когда набирает слово и нажимает пробел, я хочу пробел ключ для запуска действия, которое я определяю, чтобы разбить предложение на массив отдельных слов. Для этого я попытался переопределить функцию keyDown в классе viewController:

override func keyDown(theEvent: NSEvent) {
    if (theEvent.keyCode == 49){
        print("pressed space")
    }
}

который не работает, он работает, когда я подкласс класса NSTextView и переопределить функцию keyDown в нем, но мой textView прекращает ввод текста. Как я могу установить ключевое событие для пробела, который работает? Любое другое предложение для разбиения предложения в массив слов, нажав пробел?

Спасибо

1 ответ

Решение

Шаг 1 - настроить ваш View Controller на делегирование NSTextField. Если вы используете перья или раскадровку, это будет выглядеть так:

В основном Ctrl перетащите для просмотра контроллера и установить делегат.

Затем вы можете реагировать на текст, измененный в вашем контроллере вида:

import Cocoa

class ViewController: NSViewController {


override func controlTextDidChange(obj: NSNotification) {

    guard let textField = obj.object as? NSTextField else { return }

    if textField.stringValue.characters.last == " " {
        print(textField.stringValue.componentsSeparatedByString(" "))
    }

}
}

Он выведет массив слов, разделенных пробелом:

["а", ""]

["парень", ""]

["а", "мальчик", "пришел", ""]

["а", "мальчик", "пришел", "к", ""]

["a", "boy", "пришел", "to", "school", ""]

Вам может понадобиться удалить последний элемент из массива:

     override func controlTextDidChange(obj: NSNotification) {

    guard let textField = obj.object as? NSTextField else { return }

    if textField.stringValue.characters.last == " " {
        print(textField.stringValue.componentsSeparatedByString(" ").filter { $0 != "" })
    }

}

Для NSTextView логика похожа. Перетащите Ctrl из текстового представления, чтобы установить контроллер представления в качестве делегата:

Затем используйте следующий код:

  func textDidChange(obj: NSNotification) {

    guard let textView = obj.object as? NSTextView else { return }
    guard let stringValue = textView.textContainer?.textView?.string else { return }

    if stringValue.characters.last == " " {
        print(stringValue.componentsSeparatedByString(" ").filter { $0 != "" })
    }

}

Это будет работать нормально:

Другие вопросы по тегам