2015-11-02 13 views
1

所以我一直在研究這個bug大約一個星期了,對於我的生活我無法弄清楚發生了什麼。UITextView從textViewShouldBeginEditing中凍結iPad應用程序。 (無效的字形索引)

由於保密問題,我不能發佈太多的代碼,但我會盡我所能解釋一切。

發生了什麼是我們正在通過代碼填充UITextField,並最初使文本變灰。然後用戶可以執行以下兩種操作之一:

1)點擊一個表示「提交」的按鈕,並調用一個方法,它會執行以下方法,我們將稱之爲「commitData」。它具有以下功能:

  1. 寄存器的一個Undo經理
  2. 提交更改從灰色到與我們的應用黑色
  3. 註冊文本字段已更新,需要在應用程序關閉時要保存的文本

2)點擊文本字段的灰色文本,然後調用下面的默認蘋果方法textViewShouldBeginEditing。從這裏我們稱之爲從選項1中列出像這樣我們的「commitData」的方法:

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

    [self setActiveTextView:textView]; 
    return YES; 
} 

我們遇到的問題是,敲擊按鈕,提交灰色的文字工作完全正常,我們遇到任何問題。

無論其

當我們挖掘到文本字段,並觸發textViewShouldBeginEditing方法,我們的iPad可以凍結並完成之前讓用戶等待一兩分鐘。當我意指凍結時,我的意思是整個iPad凍結。在這種情況發生時,iPad時鐘甚至不會更新。

發生這種情況時,我們在控制檯中的錯誤代碼,說:

!!! _NSLayoutTreeLineFragmentRectForGlyphAtIndex invalid glyph index 2147483647 

我們可以得到上面的錯誤代碼按照上述步驟時,我們所有的硬件的顯示,但只能重現在iPad 2上凍結(然而準確率爲100%)。

  • 關於此問題的一個說明,我的同事通過診斷髮現,發生此錯誤時我們只有大約8MB的可用RAM。但是我們只在iPad 2上打過這麼小的內存,所以這可能只是一個巧合。

我有一種感覺,這可能給線程相關的,我們可能需要以某種方式調用我們的方法從textViewShouldBeginEditing方法返回YES之後,但我不太清楚我應該怎麼去有關。

如果任何人對如何解決這個問題有什麼想法,甚至有什麼想法可以指向正確的方向,我會非常感激。我已經找到了我可能想到的任何地方,而且我發現的與錯誤代碼相關的解決方案都沒有結束工作。

回答

3

我無法調試,所以在我的猜測可能是由非主線程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; 
} 
+0

你是英雄。你的修復工作完美。我們正在從textViewShouldBeginEditing方法內部調用更新UI元素,這顯然不會在主線程上運行。 –