监听 NSTextView 中的行删除

Listen for Deleting of Line in NSTextView

如何检测 NSTextView 中的一行(即“\n”字符)何时被删除?我可以使用 textView:doCommandBySelector: 轻松收听新行并收听 "insertNewLine:"。 (参见 here)我也可以使用相同的方法检测字符的删除,而不是监听 "deleteBackward:"。但是,我不确定如何找出正在删除的字符,因此只有在删除“\n”字符时才执行操作。谁能告诉我正确的方法来做到这一点?

解决您的问题并不像听 "deleteLine:" 方法那么简单,因为没有一种方法,正如您发现的那样。最好的方法很可能是执行以下操作:

  1. 创建一个 NSTextViewDelegate 如果您还没有
  2. 实施 - textView:shouldChangeTextInRanges:replacementStrings:
  3. 通过调用 NSString 的 lineRangeForRange:– getLineStart:end:contentsEnd:forRange:
  4. 检查将受影响的范围是否对应于整行
  5. (注意:您可以通过调用 NSString *text = myTextView.textStorage.string; 访问 NSTextView 的 NSString)
  6. (另一个重要说明:不要专门查找 '\n' 字符,因为行可以由其他字符终止,例如 '\r'、U+2028(Unicode 行分隔符)、U+2029(Unicode段落分隔符)等)
  7. (还有一个重要提示:不要忘记在 - textView:shouldChangeTextInRanges:replacementStrings: 中选择 return YES 以允许进行更改。

希望对您有所帮助。

我找到了解决此问题的解决方法,但它仅在您希望 NSTextView 始终完全适合文本大小时才有效。

它的工作方式是每次 NSTextView 中的文本发生变化时,使用 .sizeToFit() 调整 NSTextView 的大小以完全适合文本。它所做的是降低视图的高度以删除文本底部的任何白色 space,或者它增加视图的高度以容纳任何新的文本,否则这些文本将位于视图之外。我意识到,如果我在调整 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!
    }
}