以编程方式将文本插入 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 而不移动插入符号位置。的主要内容,如果未能解决你的问题,请参考以下文章