原因很狗血,写好的功能,别人用崩溃,自己用没啥问题
Bug的原因很简单,就是已输入文字中含有了Emojy表情,导致textView的selectedRange和String的endIndex 对不上,导致超出范围。
比如 伪代码:
textView.text = “12345”
// 的长度是都是5
textView.text = “12345🙀”
//textView.selectedRange.location = 7
//textView.text.count = 6
而之前的写法是直接把string插入到当前的text中,再赋值给textView,伪代码:
let targetText = ""
var text = textView.text
let range = textView.selectedRange
// 崩在了这里,超出范围额
let index = str.index(str.startIndex, offset: range.location)
text.insert(targetText, atIndex: index)
textView.text = text
这一大段写下来,丑着还挺像回事的,然鹅啊,哎
百度过程不表
最终在这里:how to insert text at any cursor position in uitextview?
有这么一句
[textView replaceRange:textView.selectedTextRange withText:insertingString];
好嘛,selectedTextRange 是一个UITextRange类型的对象,自己转好像还挺麻烦的,好在是系统API。
这个func replace(_ range: UITextRange, withText text: String)
也是textView的方法,一句话就完事儿了。
哎,孤陋寡闻了😷😷😷,百度也孤陋寡闻,查的驴唇不对马嘴。
网友评论