在文本字段中输入文本时出错:_NSLayoutTreeLineFragmentRectForGlyphAtIndex无效的字形索引7

时间:2014-03-22 10:48:28

标签: ios iphone objective-c ios7

在uitextfiled中输入文本时出现应用程序崩溃并收到如下错误:_NSLayoutTreeLineFragmentRectForGlyphAtIndex无效的字形索引7。 任何帮助将不胜感激..

2 个答案:

答案 0 :(得分:0)

__NSLayoutTreeLineFragmentRectForGlyphAtIndex invalid glyph index内容(据我所知)不会导致崩溃。

但似乎有崩溃和无效字形的根本原因。当您在布局正在进行时对文本存储执行更改和/或反之亦然时,会在自定义NSTextStorage子类-processEditing等位置弹出这类错误。

如何查找常规错误&在TextKit组件中专门

由于OP没有提供更多详细信息,因此建议列表查找而不是解决问题。完成每一步后,尝试运行程序并查找崩溃:

  1. 从组件中删除任何与TextKit相关的自定义子类和委托(!),包括UITextField子类本身,并使用系统默认组件。这不应该崩溃了。
  2. 尝试将代表放回原位,如果有的话。我在考虑NSTextStorageDelegate和朋友。
  3. 如果没有崩溃,请再次停用代理。 (如果确实如此,你知道现在是谁的错:))
  4. 现在进入组件子类;将子类按此顺序重新投入运行,从布局过程中的责任链中逐一导出:

    1. 添加自定义NSGlyphGenerator子类(如果有)。他们走在命令链的下方。如果没有任何反应,请立即再次使用系统默认值。
    2. NSTypesetter子类执行相同操作,将其放入,然后再将其关闭。
    3. NSLayoutManager子类相同,如果有的话。这个东西还在命令链的下游。
    4. 添加自定义NSTextStorage子类。文本存储位于命令链的高处,可能有多个位置可以断开。
    5. 然后尝试组合,再次从底部开始,并尝试尽可能多的组合,直到应用程序中断。

      找到导致崩溃的确切电话后,请打开一个新问题:)

答案 1 :(得分:0)

在 SwiftUI iOS 14、iPhone XS 上的听写 + 多行输入文本编辑器有一个非常相似的问题。 没有发现有效的解决方案,因此切换回单行。 我喜欢关于动态布局的 ctietze 建议 - 我认为多行 textInput 的情况就是强制重新加载 UI 并退出第一响应者。

[Assert] View <(null):0x0> does not conform to UITextInput protocol
[KBDAnalyticsLog] -[TIAnalyticsService _registerEventSpec:withCompletionHandler:]_block_invoke TIAnalyticsEventSpec with name 'thirdPartyKeyboards' is already registered.
!!! _NSLayoutTreeGetBaselineOffsetForGlyphAtIndex invalid glyph index 0

代码:

TextFieldSection(
  title: "title here",
  placeholder: "placeholder",
  text: self.$text,
  isSingleLine: false
)

struct TextFieldSection: View {
...
var body: some View {
        Section(header: Text(title)
            {
            //Would better keep ios 13 - text field, ios 14 - multiline edit https://developer.apple.com/documentation/swiftui/texteditor
            if isSingleLine {
                TextField(placeholder, text: text)
            } else {
                if #available(iOS 14.0, *) {
                    TextEditor(text: text)
                } else {
                    TextField(placeholder, text: text)
                }
            }

诀窍是控制适用于应用程序的其他部分,并且仅在用户听写的模式屏幕上出现故障。

PS 禁用了任何 3d 派对键盘以避免警告 - 也没有帮助。