2016-01-31 3 views
1

Как определить, когда строка (т. Е. Символ «\ n») удалена в NSTextView? Я могу легко слушать новые строки, используя textView:doCommandBySelector: и прослушивая "insertNewLine:". (См. here). Я также могу обнаружить удаление символов с использованием того же метода, но вместо этого прослушиваю "deleteBackward:". Однако я не уверен, как узнать, какой символ удаляется, и, следовательно, выполнять действие только при удалении символа «\ n». Может ли кто-нибудь указать мне правильный метод?Слушайте удаление строки в NSTextView

ответ

0

Я нашел обходное решение для этого, которое выполняет свою работу, но оно работает только в том случае, если вы хотите, чтобы NSTextView всегда точно соответствовал размеру текста.

Как это работает, каждый раз, когда текст в NSTextView изменяется, вы изменяете размер NSTextView, чтобы точно соответствовать тексту, используя .sizeToFit(). Что это делает, так это уменьшение высоты представления для удаления любого пробела в нижней части текста или увеличение высоты представления для размещения любого нового текста, который был бы иным образом вне представления. Я понял, что если бы я сохранил высоту NSTextView, прежде чем я изменил ее размер, я мог видеть, уменьшилась ли высота после этого факта. Если бы высота уменьшилась, тогда я знал, что линия была удалена. Вот код:

func textDidChange(notification: NSNotification) { 
    // Save original height of view: 
    let presize = textView.frame.size.height 

    textView.sizeToFit() // Resize view so that it fits the text exactly 

    if presize > textView.frame.size.height { // see if textView's new height is less than what it used to be 
     // line has been deleted! 
    } 
} 

0

Решение вашей проблемы не так просто, как прослушивание метода «deleteLine:», потому что его нет, как вы выяснили. Наиболее вероятно, лучший способ пойти об этом, чтобы сделать следующее:

  1. Создание NSTextViewDelegate, если вы еще не
  2. Реализовать - textView:shouldChangeTextInRanges:replacementStrings:
  3. Проверьте, правильно ли диапазоны, которые будут затронуты соответствуют целом линии по призванию NSString-х lineRangeForRange: или – getLineStart:end:contentsEnd:forRange:
  4. (Примечание: вы можете получить доступ к NSString вашего NSTextView по телефону NSString *text = myTextView.textStorage.string;)
  5. (Еще одно важное замечание: не стоит искать «\ n ', потому что строки могут быть завершены другими символами, такими как' \ r ', U + 2028 (разделитель строк Unicode), U + 2029 (разделитель абзацев Unicode) и т. д.)
  6. (Еще одно важное замечание: не забудьте вернуть YES в - textView:shouldChangeTextInRanges:replacementStrings:, чтобы разрешить изменение.

Надеюсь, это поможет.