在NSTextView中侦听删除行

时间:2016-01-31 03:35:18

标签: cocoa notifications nsnotificationcenter nstextview

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

2 个答案:

答案 0 :(得分:0)

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

  1. 如果您尚未
  2. ,请创建NSTextViewDelegate
  3. 实施 - textView:shouldChangeTextInRanges:replacementStrings:
  4. 通过调用NSString的lineRangeForRange:– getLineStart:end:contentsEnd:forRange:
  5. ,检查受影响的范围是否与整行相对应
  6. (注意:您可以通过调用NSString *text = myTextView.textStorage.string;来访问NSTextView的NSString)
  7. (另一个重要说明:请勿专门查找'\ n'字符,因为行可以被其他字符终止,例如'\ n',U + 2028(Unicode行分隔符),U + 2029(Unicode段分隔符) )等。)
  8. (另一个重要说明:不要忘记在- textView:shouldChangeTextInRanges:replacementStrings:中返回YES以允许进行更改。
  9. 我希望这会有所帮助。

答案 1 :(得分: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!
    }
}