textViewDidEndEditing: не вызывается - PullRequest
       18

textViewDidEndEditing: не вызывается

1 голос
/ 12 декабря 2011

Я программно заменяю UITextField на UITextView, но, похоже, это что-то нарушает в коде Apple.

Класс, который выполняет переключение, является делегатом для обоих.Все методы делегата в FIELD работают правильно - я использую "didBeginEditing", чтобы вызвать переключение из FIELD -> VIEW.

Методы didBeginEditing / shouldBeginEditing в VIEW также вызываются корректно.

Однако ... методы shouldEndEditing / didEndEditing делегата VIEW никогда не вызываются.Неважно, как я убираю фокус, они никогда не вызываются (у меня они имеют точки останова, также с лог-операторами).например, НИКАКАЯ из следующих работ:

  1. Коснитесь другого текстового поля на экране (делегат FIELD получит «shouldBegin» и «didBegin» - делегат VIEW получит ничего )
  2. Использование распознавателя жестов в фоновом представлении для вызова «resignFirstResponder» для каждого элемента на экране (если выбрано другое поле, делегат FIELD получает «shouldEnd» и «didEnd». VIEW получает даже nothing если он выбран)

Тот факт, что должны / должны начаться методы, вызывается, показывает, что делегат был назначен в порядке и работает правильно - но почему / как игнорируются методы завершения / завершения.?Как будто у Apple есть ошибка в их коде для обнаружения существования этих методов.

Примечание: я использовал автозаполнение Xcode / content-assist для создания методов, поэтому я уверен, что опечаток нет.Просто чтобы быть ясно:

-(BOOL)textViewShouldEndEditing:(UITextView *)textView
{
    textComments.text = textView.text;

    [textView.superview insertSubview:self.textComments aboveSubview:textView];
    [textView removeFromSuperview];

    return TRUE;
}

-(void)textViewDidEndEditing:(UITextView *)textView
{
    textComments.text = textView.text;

        [textView.superview insertSubview:self.textComments aboveSubview:textView];
        [textView removeFromSuperview];
}

-(BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
    NSLog(@"blah" );

    return TRUE;
}

-(void)textViewDidBeginEditing:(UITextView *)textView
{
    NSLog(@"blah" );
}

Ответы [ 3 ]

2 голосов
/ 29 января 2012

У меня сегодня была такая же проблема.Это происходило только на моем iPad, а не в симуляторе.Это происходило на iPad не всегда, но чаще всего.Я исправил это, «подтвердив» делегата ... звучит как бессмысленно, потому что он назначен внутри самого метода делегата, но он работает для меня.

-(void)textViewDidBeginEditing:(UITextField *)textField  {
NSLog(@"textfield began");
textField.delegate = self;
}
2 голосов
/ 30 января 2012

Я наконец-то нашел причину: какой-то сторонний код подписывался на уведомления Apple о появлении клавиатуры / появлении / удалении и удалял себя как слушателя.

К сожалению, NSNotificationCenter Apple не может удалить один селектор приемника / обратного вызова - он должен удалить все обратные вызовы данного экземпляра для данного шаблона уведомления.

Таким образом, в качестве побочного эффекта, эта сторонняя сторонакод удалял мой селектор обратного вызова, хотя ни один из моего собственного кода не удалил его.Я устанавливал / сбрасывал делегатов в клавиатурных уведомлениях.Точное время, когда Apple отображает / исчезает с клавиатуры, похоже, несколько отличается (последовательно) для текстовых полей и текстовых представлений, и поэтому поведение влияет только на один тип, а не на другой.

Я предполагаю, чтоДоминик, возможно, видит подобную проблему - и его призыв переустановить делегата «подталкивает» время некоторых уведомлений (случайно), тем самым исправляя его.

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

Полагаю, вам нужно вернуть true следующим способом: textViewShouldEndEditing.Вы должны получать предупреждение, если не возвращаетесь, потому что этот метод предполагает возврат BOOL

-(BOOL)textViewShouldEndEditing:(UITextView *)textView
{
    textComments.text = textView.text;

    [textView.superview insertSubview:self.textComments aboveSubview:textView];
    [textView removeFromSuperview];

    return YES;
}
...