Распознавание ключевого события во всем окне
Я работаю над приложением транслитерации, которое получает некоторый текст из 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 != "" })
}
}
Это будет работать нормально: