所以我有一个用户可以编辑的 UITextView,但也可能有一些文本以编程方式插入到 textView 中,并且它可以插入到 textView 的任意范围内。目前,这也会从用户当前工作的位置移动插入符号的位置,这是不希望的。所以每当我这样做时:
self.textView.text = //some text inserted
它移动插入符号的位置。那么,防止插入符号位置移动的最佳方法是什么,或者让它完全不了解并独立于程序更改而仅响应用户更改而移动?
所以我有一个用户可以编辑的 UITextView,但也可能有一些文本以编程方式插入到 textView 中,并且它可以插入到 textView 的任意范围内。目前,这也会从用户当前工作的位置移动插入符号的位置,这是不希望的。所以每当我这样做时:
self.textView.text = //some text inserted
它移动插入符号的位置。那么,防止插入符号位置移动的最佳方法是什么,或者让它完全不了解并独立于程序更改而仅响应用户更改而移动?
最好的答案是像你一样设置插入的文本,但之后,使用以下方法设置插入符号位置:
textView.selectedRange = NSMakeRange(0,0)
第一个数字是文本视图中您要放置插入符号的位置。如果您想将其保留在开头而不管添加任何文本,这就是您将如何做到的。但是,您可能希望包含一个条件以仅在添加的非键入文本周围保留此条件。当用户键入时,您希望插入符号移动。
在以编程方式插入文本之前,您可以通过UITextView 的 " selectedRange
" 属性获取当前插入点。
插入新文本后,您可以将文本视图的选定范围重置为插入之前的范围......或者,如果插入点在插入的新文本块之前,则需要重新计算考虑到插入文本的长度,前一个插入符号位置的位置。
我认为您应该使用UITextView
'textStorage
属性。
例如:
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
。