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

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

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

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

Благодарность


person omgtheykilledkenny    schedule 15.08.2016    source источник
comment
Вы пробовали искать? Это может помочь вам. stackoverflow.com/questions/32446978/   -  person Khundragpan    schedule 15.08.2016


Ответы (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", ""]

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

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

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

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

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

     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 != "" })
    }

}

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

введите здесь описание изображения

person Eugene Mankovski    schedule 15.08.2016
comment
привет, спасибо, ваш метод отлично работает для текстового поля, но поскольку мой текст длинный, я использую NSTextView, и он не наследует NSControl. как я могу вызвать функцию controlTextDidChange в NSTextView? - person omgtheykilledkenny; 16.08.2016