2015-11-02 1 views
1

Итак, я работаю над этой ошибкой уже около недели, а для жизни я не могу понять, что происходит.UITextView запустит приложение iPad из textViewShouldBeginEditing. (Invalid Glyph Index)

Из-за проблем с конфиденциальностью я не могу опубликовать слишком много кода, но я сделаю все возможное, чтобы все объяснить.

Что происходит, так это то, что мы заполняем UITextField с помощью кода и изначально выделяем текст серым цветом. Затем пользователь может сделать одну из двух вещей:

1) Нажмите кнопку с надписью «commit» и вызывается метод, который выполняет следующий метод: «commitData». Он выполняет следующие функции:

  1. Регистров фиксацию с отменами менеджером
  2. Изменяет текст от серого до черного
  3. регистра с нашим приложением, что текстовое поле было обновлено и должно быть сохранено при закрытии программы

2) Нажмите на текстовое поле с выделенным серым текстом, который затем вызывает следующий метод appleViewShouldBeginEditing по умолчанию. Отсюда мы называем наш метод «commitData» перечислены от варианта 1 следующим образом:

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

    [self setActiveTextView:textView]; 
    return YES; 
} 

вопрос мы с, что нажав на кнопку, чтобы зафиксировать неактивны текст отлично работает, и мы бежим в каких-либо проблем ,

ОДНАКО

Когда мы нажмите на текстовое поле и вызвать метод textViewShouldBeginEditing, наши IPADS может замерзнуть и сделать ожидание пользователя в течение нескольких минут, прежде чем закончить. Когда я подразумеваю замораживание, я имею в виду, что весь iPad замерзает. IPad-часы даже не будут обновляться, пока это происходит.

Когда это происходит, мы получаем код ошибки в консоли, которая говорит:

!!! _NSLayoutTreeLineFragmentRectForGlyphAtIndex invalid glyph index 2147483647 

Мы можем получить код ошибки выше, чтобы увидеть из всех наших аппаратных средств, когда после вышеуказанных шагов, но может воспроизводить только замораживание на iPad 2 (с 100% точностью).

  • Заметка об этом, мой сотрудник обнаружил через диагностику, что у нас только около 8 МБ свободной ОЗУ при возникновении этой ошибки. Мы только когда-либо ударили эту маленькую ОЗУ на iPad 2, так что это может быть просто совпадением.

У меня есть ощущение, что это может быть связано с потоками, и что мы, возможно, придется как-то называть наш метод после возвращения YES из метода textViewShouldBeginEditing, но я не совсем уверен, как я должен идти об этом.

Если у кого-нибудь есть идеи о том, как исправить это, или даже идеи, которые могли бы указать мне в правильном направлении, я был бы невероятно благодарен. Я искал всюду, о чем я могу подумать, и ни одно из решений, которые я нашел, связанные с кодом ошибки, не закончилось.

ответ

3

Я не могу отлаживать, поэтому, по моему мнению, это может быть вызвано неинтерфейсом интерфейса пользователя. Итак, мое предложение - убедиться, что ваш код пользовательского интерфейса находится в 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, который, по-видимому, не работает в основном потоке. –

Смежные вопросы