监听 NSTextView 中的行删除
Listen for Deleting of Line in NSTextView
如何检测 NSTextView
中的一行(即“\n”字符)何时被删除?我可以使用 textView:doCommandBySelector:
轻松收听新行并收听 "insertNewLine:"
。 (参见 here)我也可以使用相同的方法检测字符的删除,而不是监听 "deleteBackward:"
。但是,我不确定如何找出正在删除的字符,因此只有在删除“\n”字符时才执行操作。谁能告诉我正确的方法来做到这一点?
解决您的问题并不像听 "deleteLine:" 方法那么简单,因为没有一种方法,正如您发现的那样。最好的方法很可能是执行以下操作:
- 创建一个
NSTextViewDelegate
如果您还没有
- 实施
- textView:shouldChangeTextInRanges:replacementStrings:
- 通过调用 NSString 的
lineRangeForRange:
或 – getLineStart:end:contentsEnd:forRange:
检查将受影响的范围是否对应于整行
- (注意:您可以通过调用
NSString *text = myTextView.textStorage.string;
访问 NSTextView 的 NSString)
- (另一个重要说明:不要专门查找 '\n' 字符,因为行可以由其他字符终止,例如 '\r'、U+2028(Unicode 行分隔符)、U+2029(Unicode段落分隔符)等)
- (还有一个重要提示:不要忘记在
- 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!
}
}
如何检测 NSTextView
中的一行(即“\n”字符)何时被删除?我可以使用 textView:doCommandBySelector:
轻松收听新行并收听 "insertNewLine:"
。 (参见 here)我也可以使用相同的方法检测字符的删除,而不是监听 "deleteBackward:"
。但是,我不确定如何找出正在删除的字符,因此只有在删除“\n”字符时才执行操作。谁能告诉我正确的方法来做到这一点?
解决您的问题并不像听 "deleteLine:" 方法那么简单,因为没有一种方法,正如您发现的那样。最好的方法很可能是执行以下操作:
- 创建一个
NSTextViewDelegate
如果您还没有 - 实施
- textView:shouldChangeTextInRanges:replacementStrings:
- 通过调用 NSString 的
lineRangeForRange:
或– getLineStart:end:contentsEnd:forRange:
检查将受影响的范围是否对应于整行
- (注意:您可以通过调用
NSString *text = myTextView.textStorage.string;
访问 NSTextView 的 NSString) - (另一个重要说明:不要专门查找 '\n' 字符,因为行可以由其他字符终止,例如 '\r'、U+2028(Unicode 行分隔符)、U+2029(Unicode段落分隔符)等)
- (还有一个重要提示:不要忘记在
- 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!
}
}