2016-08-15 3 views
0

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

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

, который не работает, она работает, когда я подкласс класса NSTextView и переопределить KeyDown функции в нем, но мой TextView останавливает inputing текста. Как я могу установить ключевое событие для ключа пространства, которое работает? любое другое предложение о том, чтобы сломать предложение в массив слов, нажав пробел?

благодаря

+0

Пробовали ли вы искать? Это может вам помочь. http://stackoverflow.com/questions/32446978/swift-capture-keydown-from-nsviewcontroller – Khundragpan

ответ

0

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

enter image description here

В основном 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(" ")) 
    } 

} 
} 

Он будет распечатать массив слов, которые были разделены пробелом:

[ «а», «»]

[ "а", "мальчик", ""]

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

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

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

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

 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 перетащить из вида текста, чтобы установить вид контроллера в качестве делегата: enter image description here

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

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

} 

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

enter image description here

+0

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

+0

Я обновил ответ для NSTextView –

+0

Действительно, сработал, спасибо;) – omgtheykilledkenny

Смежные вопросы