iOS: «Сообщение отправлено освобожденному экземпляру» при отставке первого респондента в UITextView, когда отображается всплывающее окно автокоррекции - PullRequest
2 голосов
/ 13 декабря 2011

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

[textView resignFirstResponder];

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

Thread 1: Program received signal: "EXC_BAD_ACCESS".

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

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

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

Редактировать 1: Я все еще хочу включить автокоррекцию.

Редактировать 2: Пожалуйста, взгляните на изображение ниже.

auto correction is shown

Редактировать 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];

    ...
}

Ответы [ 2 ]

2 голосов
/ 09 июля 2012

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

- (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 делегат,

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

0 голосов
/ 19 декабря 2011

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

Концепция состоит в том, чтобы выяснить, содержит ли подпредставления текстового представления представление 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];
}

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

...