Вставьте текст в UITextView программно, не перемещая позицию каретки.

Итак, у меня есть UITextView, который пользователь может редактировать, но также может быть некоторый текст, вставленный программно в textView, и он может быть вставлен в любой произвольный диапазон в textView. В настоящее время это также перемещает позицию каретки из того места, где в данный момент работал пользователь, что нежелательно. Поэтому в любое время я делаю это:

self.textView.text = //some text inserted

Он перемещает позицию каретки. Итак, что было бы лучшим способом предотвратить перемещение позиции каретки или сделать ее полностью невежественной и независимой от программных изменений и перемещаться только в ответ на изменения пользователя?

3 ответа

Лучшим ответом было бы установить текст, который будет вставлен, как у вас, но затем установить позицию каретки, используя следующий метод:

textView.selectedRange = NSMakeRange(0,0)

Первое число - это место в текстовом представлении, которое вы хотите поместить каретку. Если вы хотите сохранить его в начале независимо от того, какой текст будет добавлен, это то, как вы это сделаете. Однако вы бы хотели включить условное условие, чтобы оно оставалось только вокруг добавляемого нетипизированного текста. Когда пользователь печатает, вы хотите, чтобы курсор перемещался.

Я думаю, что вы должны использовать UITextView "s 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,

Перед программной вставкой текста вы можете получить текущую точку вставки через UITextView selectedRange собственность

Как только вы закончите вставку нового текста, вы можете сбросить выбранный диапазон представления текста до того, который был до вставки... или, если точка вставки была до вставки нового блока текста, вам придется пересчитать положение предыдущей позиции каретки с учетом длины вставленного текста.

Другие вопросы по тегам