iOS: сообщение, отправленное освобожденному экземпляру при увольнении первого респондента в UITextView, когда отображается его всплывающее окно с автокоррекцией

У меня есть настраиваемая панель инструментов с кнопкой «Готово» для вспомогательного представления ввода в моем текстовом представлении. Когда нажимается эта кнопка «Готово», я хочу отказаться от текстового представления первого респондента, поэтому я вызываю:

[textView resignFirstResponder];

Это вызовет ошибку:

Thread 1: Program received signal: "EXC_BAD_ACCESS".

при нажатии кнопки «Готово» при отображении автокоррекции (см. изображение ниже). Ошибка до сих пор даже я называю:

if ([textView isFirstResponder] && [textView canResignFirstResponder]) [textView resignFirstResponder];

Кажется, что текстовое представление является первым респондентом и может быть уволено, но я не могу отказаться от него. Как я могу решить эту ошибку? Спасибо.

Изменить 1: я все еще хочу включить автокоррекцию.

Изменить 2: взгляните на изображение захвата ниже.

отображается автокоррекция

Редактировать 3: после включения Zombies в настройках схемы зарегистрированное сообщение:

-[TIZephyrCandidate wordOriginFeedbackID]: message sent to deallocated instance 0x52bbc50

но я не знаю, что означает это сообщение и что делать дальше.

Изменить 4: метод увольнения первого респондента будет вызываться при нажатии кнопки «Готово», внутри кнопки добавляется цель и действие следующей строкой кода:

[doneButton addTarget:self action:@selector(resignAllFirstResponders) forControlEvents:UIControlEventTouchUpInside];

который resignAllFirstResponders:

- (void)resignAllFirstResponders
{
    ...

    if ([textView canResignFirstResponder] && [textView isFirstResponder]) 
        [textView resignFirstResponder];

    ...
}

person Protocole    schedule 13.12.2011    source источник
comment
Включите Zombies в настройках схемы Xcode 4. Реплицируйте сбой и проверьте, какой выпущенный объект, к которому отправляется сообщение, вызывает исключение.   -  person Mark Adams    schedule 16.12.2011
comment
@MarkAdams Я зашел в Xcode - ›Продукт -› Изменить схему ... и поставил флажок перед Включить зомби-объекты. Это то, что вы имеете в виду, говоря «Включить зомби» в настройках схемы Xcode 4? Если да, просмотрите сообщение журнала в моем отредактированном вопросе еще раз. Спасибо.   -  person Protocole    schedule 16.12.2011
comment
Итак, мы знаем, что мы пытались отправить сообщение wordOriginFeedbackID экземпляру TIZephyrCandidate, который уже был выпущен. Теперь мы пытаемся выяснить, почему это вызывает увольнение с видимым всплывающим окном автозамены. Где вызывается этот метод относительно текстового представления?   -  person Mark Adams    schedule 16.12.2011
comment
Держи телефон. Только что заметил, что поток 1 дает сбой. Вы пытаетесь уволить первого респондента из фоновой беседы? Доступ к объектам пользовательского интерфейса возможен только в основном потоке. Может объяснить это безумие.   -  person Mark Adams    schedule 16.12.2011
comment
@MarkAdams Пожалуйста, взгляните на мой отредактированный вопрос еще раз, чтобы узнать, как я вызываю этот метод. По вопросу о потоке, пожалуйста, предложите мне, как проверить, вызывается ли метод в фоновом потоке или в основном потоке. Спасибо.   -  person Protocole    schedule 16.12.2011
comment
Я полагаю, вы бы знали, если бы использовали фоновый поток. Нам нужно выяснить, что такое TIZephyrCandidate и почему оно отправляется wordOriginFeedbackID в ответ на то, что текстовое представление отказывается от статуса первого респондента. У вас есть UITextViewDelegate метод, -textViewDidEndEditing: реализован?   -  person Mark Adams    schedule 16.12.2011
comment
Нет, у меня не реализовано - (void)textFieldDidEndEditing:(UITextField *)textField, но есть другие делегаты текстового представления, которыми являются - (void)textViewDidBeginEditing:(UITextView *)textView, - (void)textViewDidChange:(UITextView *)textView и - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text.   -  person Protocole    schedule 16.12.2011


Ответы (2)


если вы используете:

- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)aRange replacementText:(NSString *)aText 

UITextViewDelegate и напрямую измените текст в методе, например:

- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)aRange replacementText:(NSString *)aText
{
 aTextView.text = @"hi";

 return YES;
}

вызывает сбой.

  1. появился вид проверки орфографии,
  2. resignFirstResponder из UITextView,
  3. изменить текст напрямую textView:shouldChangeTextInRange:replacementText делегат,

приложение будет аварийно завершено.

person yuch    schedule 09.07.2012

Позвольте мне ответить на свой вопрос. В любом случае, обратите внимание, что я не уверен, что это достаточно хорошее решение, но я просто хочу поделиться своим текущим прогрессом и все еще жду лучшего решения.

Идея состоит в том, чтобы выяснить, содержат ли подпредставления текстового представления представление UIAutocorrectInlinePrompt, которое является всплывающим окном автоматического исправления, вызывающим ошибку, или нет. Затем вызывайте метод resignFirstResponder только тогда, когда набор подвидов не содержит UIAutocorrectInlinePrompt. Мой код такой:

NSMutableString *subviewMutableString = [[NSMutableString alloc] init];
[subviewMutableString setString:@""];
for (UIView *subview in textView.subviews)
{
    [subviewMutableString appendFormat:@"%@", subview];
}
if ([subviewMutableString rangeOfString:@"UIAutocorrectInlinePrompt"].location == NSNotFound)
{
    [textView resignFirstResponder];
}

Это не позволит отказаться от просмотра текста из первого респондента, когда отображается всплывающее окно автокоррекции.

person Protocole    schedule 19.12.2011