UITextView拆分段落保存Range时重复文本索引错误问题求助
解决UITextView重复段落Range获取错误的问题
这个问题我之前也碰到过!核心原因是你在遍历段落时额外调用了range(of: substring)——这个API的默认行为是从字符串开头查找第一个匹配的子串,所以不管是第几个重复的段落,它都会返回第一个匹配项的Range,这就是重复内容Range相同的根源。
修正后的代码
直接使用enumerateSubstrings闭包中提供的原生range参数即可,不需要再手动查找:
func getParagraphModel() { guard let text = noteContents.text else { return } var currentModels: [ParagraphModel] = [] text.enumerateSubstrings(in: text.startIndex..., options: .byParagraphs) { substring, range, _, stop in // 直接使用遍历过程中返回的range,这就是当前段落的精确位置 if let substring = substring, !substring.isEmpty { currentModels.append(ParagraphModel(text: substring, range: range)) } } self.models = currentModels }
为什么这样能解决问题?
enumerateSubstrings在按段落遍历文本时,会把每个段落对应的:
- 子串内容(
substring) - 该子串在原文本中的精确Range(
range参数)
一起传递给闭包。这个Range是遍历到当前段落时直接计算出来的,完全不受内容重复的影响,所以每个重复段落都会拿到自己对应的正确位置。
你之前的错误操作是在已经拿到正确Range的情况下,又用range(of:)重新查找,反而覆盖了正确的位置信息。
内容的提问来源于stack exchange,提问作者mink23
相关产品推荐
相关产品推荐

