代码之家  ›  专栏  ›  技术社区  ›  Aaron Hayman

UITextInput-可以返回不正确的“beginingOfDocument”和“endOfDocument”吗?

  •  0
  • Aaron Hayman  · 技术社区  · 12 年前

    我正在使用核心文本在iOS中创建自己的文本编辑器。除了一个例外,几乎所有东西都很好用:当文本文档“大”时,东西真的开始变慢。我发现iOS在每次更改时都会请求整个文档文本,包括选择更改(至少当我通知UITextInputDelegate选择更改时)。问题的一部分是,我已经优化了我的核心文本代码,将文档拆分为段落,只呈现更改的段落。但这样做也会拆分文档字符串( NSAttributedString )转换为单独的“段落对象”。因此,当iOS请求整个文本文档时,我必须将所有这些字符串组合成一个字符串,这需要时间和内存。

    我的解决方案是给iOS不正确的 UITextPosition beginningOfDocument endOfDocument 方法,将这些位置限制为与当前选择相交的段落。这实际上非常有效。iOS现在只请求更改当前段落,这完全消除了速度减慢的情况。

    到目前为止,一切都很好,但我有点担心这可能会破坏一些东西。我已经对此进行了一些测试,没有任何损坏,但文本编辑器可能很难测试(谁知道它是否会在某些边缘条件下损坏)。

    我有两个问题:

    1. iOS是否应该在每次更改时请求整个文档文本?如果不是,那么也许我的 UITextInput 返回错误值的协议方法,以某种方式导致iOS请求整个文档。
    2. 有人知道这是否真的会破坏任何东西吗?
    1 回复  |  直到 12 年前
        1
  •  0
  •   Aaron Hayman    12 年前

    好吧,我已经测试了很长一段时间了,我终于找到了一个使用这种技术会破坏功能的地方。 UITextInput 使用 beginningOfDocument endOfDocument 以确定当你按下蓝牙键盘上的箭头键时,它是否有“移动”的空间。仅返回当前所选段落的开头和结尾会导致它在位于该段落的开头或结尾时忽略“箭头”按钮,而这些箭头表示试图移动到它认为的文档的开头/结尾之外。它很容易修复。如果当前的选择从一段的开头/结尾开始,我现在也将上一段/下一段分别作为文件的一部分返回。