以编程方式将文本插入 UITextView 而不移动插入符号位置。

Posted

技术标签:

【中文标题】以编程方式将文本插入 UITextView 而不移动插入符号位置。【英文标题】:Insert text into UITextView programmatically without moving caret position. 【发布时间】:2013-08-03 01:09:28 【问题描述】:

所以我有一个用户可以编辑的 UITextView,但也可能有一些文本以编程方式插入到 textView 中,并且它可以插入到 textView 中的任意范围。目前,这也会将插入符号位置从用户当前工作的位置移动,这是不可取的。所以每当我这样做时:

self.textView.text = //some text inserted

它移动插入符号的位置。那么,防止插入符号位置移动的最佳方法是什么,或者使其完全不了解和独立程序更改而仅响应用户更改而移动?

【问题讨论】:

【参考方案1】:

最好的答案是像你一样设置插入的文本,但之后,使用以下方法设置插入符号的位置:

textView.selectedRange = NSMakeRange(0,0)

第一个数字是文本视图中您要放置插入符号的位置。如果您想将其保留在开头,而不管添加任何文本,这就是您的做法。但是,您可能希望包含一个条件,以仅在添加的非键入文本周围保留此条件。当用户键入时,您希望插入符号移动。

【讨论】:

【参考方案2】:

在以编程方式插入文本之前,您可以通过UITextView's "selectedRange" property 获取当前插入点。

插入新文本后,您可以将文本视图的选定范围重置为插入之前的范围...或者,如果插入点位于插入的新文本块之前,则需要考虑插入文本的长度,重新计算前一个插入符号位置的位置。

【讨论】:

所以这也是我认为可行的方法,我在提出问题之前就想到了,但我无法让它在我的用例中正常工作。我要么错过了什么,要么我需要更多的东西。虽然我已经在这方面工作了一段时间,所以我的大脑现在已经炸了。【参考方案3】:

我认为你应该使用UITextView's textStorage property。

例如:

let string = "some text"
let range = NSRange(location: 4, length: 0) // arbitrary range
textView.textStorage.replaceCharacters(in: range, with: string)

这样做不会导致光标移动。

注意:如果您以典型方式初始化UITextView(例如,在代码中它只是UITextView(frame: .zero, textContainer: nil)),那么textStorage 会被设置为NSConcreteTextStorage 的实例,它是NSTextStorage 的子类,这是NSMutableAttributedString 的子类。

【讨论】:

以上是关于以编程方式将文本插入 UITextView 而不移动插入符号位置。的主要内容,如果未能解决你的问题,请参考以下文章

滚动 UITextView 以显示以编程方式添加的新文本

UITextView如何禁用带有内容插入的水平滚动

Swift - 以编程方式居中 UITextView

我将如何(以编程方式)将 UITextView 的高度设置为其在 Swift 中的内容大小?

我可以在 UITextView 中以编程方式选择文本吗?

你能以编程方式接受 UITextView 中的拼写更正吗?