You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:36:32