Как определить, когда строка (т. Е. Символ «\ n») удалена в NSTextView
? Я могу легко слушать новые строки, используя textView:doCommandBySelector:
и прослушивая "insertNewLine:"
. (См. here). Я также могу обнаружить удаление символов с использованием того же метода, но вместо этого прослушиваю "deleteBackward:"
. Однако я не уверен, как узнать, какой символ удаляется, и, следовательно, выполнять действие только при удалении символа «\ n». Может ли кто-нибудь указать мне правильный метод?Слушайте удаление строки в NSTextView
ответ
Я нашел обходное решение для этого, которое выполняет свою работу, но оно работает только в том случае, если вы хотите, чтобы 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!
}
}
Решение вашей проблемы не так просто, как прослушивание метода «deleteLine:», потому что его нет, как вы выяснили. Наиболее вероятно, лучший способ пойти об этом, чтобы сделать следующее:
- Создание
NSTextViewDelegate
, если вы еще не - Реализовать
- textView:shouldChangeTextInRanges:replacementStrings:
- Проверьте, правильно ли диапазоны, которые будут затронуты соответствуют целом линии по призванию NSString-х
lineRangeForRange:
или– getLineStart:end:contentsEnd:forRange:
- (Примечание: вы можете получить доступ к NSString вашего NSTextView по телефону
NSString *text = myTextView.textStorage.string;
) - (Еще одно важное замечание: не стоит искать «\ n ', потому что строки могут быть завершены другими символами, такими как' \ r ', U + 2028 (разделитель строк Unicode), U + 2029 (разделитель абзацев Unicode) и т. д.)
- (Еще одно важное замечание: не забудьте вернуть YES в
- textView:shouldChangeTextInRanges:replacementStrings:
, чтобы разрешить изменение.
Надеюсь, это поможет.