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

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

self.textView.text = //some text inserted

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

【问题讨论】:

    标签: ios objective-c uitextview


    【解决方案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 的子类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多