UITextView 从 textViewShouldBeginEditing 冻结 iPad 应用程序。 (无效的字形索引)

2024-03-08

所以我已经研究这个错误大约一周了,但我一生都无法弄清楚发生了什么。

由于保密问题,我不能发布太多代码,但我会尽力解释所有内容。

发生的情况是,我们通过代码填充 UITextField,并且最初将文本显示为灰色。然后,用户可以执行以下两项操作之一:

1)点击一个显示“commit”的按钮,然后调用一个方法,该方法执行以下我们称为“commitData”的方法。它执行以下操作:

  1. 使用撤消管理器注册提交
  2. 将文本从灰色更改为黑色
  3. 在我们的应用程序中注册文本字段已更新,需要在应用程序关闭时保存

2)点击带有灰色文本的文本字段,然后调用以下默认的苹果方法textViewShouldBeginEditing。从这里我们调用选项 1 中列出的“commitData”方法,如下所示:

-(BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
    if ([[self box] hasGreyedOutText])
        [[self box] commitData];

    [self setActiveTextView:textView];
    return YES;
}

我们遇到的问题是,点击按钮提交灰色文本效果非常好,我们没有遇到任何问题。

HOWEVER

当我们点击文本字段并触发 textViewShouldBeginEditing 方法时,我们的 iPad 可能会冻结并让用户等待几分钟才能完成。当我说冻结时,我的意思是整个 iPad 冻结。发生这种情况时,iPad 时钟甚至不会更新。

发生这种情况时,我们会在控制台中收到错误代码,其中显示:

!!! _NSLayoutTreeLineFragmentRectForGlyphAtIndex invalid glyph index 2147483647

按照上述步骤,我们可以从我们的所有硬件中获取上面显示的错误代码,但只能在 iPad 2 上重现冻结现象(但准确度为 100%)。

  • 对此请注意,我的同事通过诊断发现,当发生此错误时,我们只有大约 8MB 的可用 RAM。然而,我们在 iPad 2 上只使用过这么小的 RAM,所以这可能只是巧合。

我有一种感觉,这可能与线程有关,并且我们可能需要在从 textViewShouldBeginEditing 方法返回 YES 后以某种方式调用我们的方法,但我不太确定应该如何处理。

如果有人对如何解决这个问题有任何想法,或者甚至可以为我指明正确方向的想法,我将非常感激。我已经查看了我能想到的所有地方,但我找到的与错误代码相关的解决方案都没有最终起作用。


我无法调试,所以我猜测这可能是由非主线程UI操作引起的。所以,我的建议是确保你的 UI 代码位于 mainThread 中。尝试这个:

-(BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
    dispatch_async(dispatch_get_main_queue(), ^{ 
    if ([[self box] hasGreyedOutText])
        [[self box] commitData];
    [self setActiveTextView:textView];
    }
    return YES;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UITextView 从 textViewShouldBeginEditing 冻结 iPad 应用程序。 (无效的字形索引) 的相关文章

随机推荐