Метод делегата UITextView textViewDidChangeSelection не вызывается при возврате из фона

Мой ViewController реализует UITextView метод делегата textViewDidChangeSelection. Все работает так, как ожидалось при тестировании. Однако, если приложение переводится в фоновый режим, а затем снова становится активным, метод делегата не вызывается при изменении выбора в TextView. Кто-нибудь еще, у кого была эта проблема?

Мой подкласс UITextView делает это:

self.inputView = [[UIView alloc] initWithFrame:CGRectZero];

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

Подкласс также делает это:

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
{
    if ( [UIMenuController sharedMenuController] )
    {
        [UIMenuController sharedMenuController].menuVisible = NO;
    }
    return NO;
}

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


person empee    schedule 10.03.2013    source источник
comment
Возможно, ваш контроллер представления выпускается в фоновом режиме и воссоздается при входе на передний план. Тогда textView.delegate будет равен нулю. Вы можете проверить это?   -  person Marcelo Fabri    schedule 10.03.2013
comment
Я проверил, было ли оно нулевым в методе didBecomeActive appDelegate, но это не так. Я также протестировал установку ViewController в качестве делегата в этом методе.   -  person empee    schedule 10.03.2013
comment
Возможно, ваш textView становится нулевым. Попробуйте установить делегата в viewDidAppear: например.   -  person Marcelo Fabri    schedule 10.03.2013
comment
Мой textview не становится нулевым. Я могу установить его текст, и это работает. Не вызывается только метод делегата. Это действительно странно.   -  person empee    schedule 10.03.2013
comment
Разместите код. Я только что создал новый проект с UITextView и реализовал для него textViewDidChangeSelection:. Выбрав текстовое представление, я нажал кнопку «Домой», затем снова запустил приложение. Клавиатура все еще поднята, и метод снова срабатывает.   -  person memmons    schedule 10.03.2013
comment
У меня есть текстовое представление с пользовательским inputView CGRectZero, и вместо этого я программно добавляю текст в текстовое представление при нажатии кнопок. Но это не должно иметь никакого значения, я думаю. Но, по крайней мере, есть надежда, что это сработает для вас.   -  person empee    schedule 10.03.2013
comment
Разместите свой код. Без кода мы просто стреляем в темноте.   -  person memmons    schedule 10.03.2013
comment
Ну, я спрашивал, была ли у кого-то такая же проблема, и я думаю, что никто не признал проблему. Я отредактирую вопрос, добавив еще немного кода, а также отвечу тем, что, по моему мнению, является решением или, по крайней мере, обходным путем, который я только что обнаружил.   -  person empee    schedule 11.03.2013


Ответы (2)


Метод делегата UITextView textViewDidChangeSelection: будет срабатывать снова, когда приложение выйдет из фонового режима. Значит, в вашем приложении должно происходить что-то еще.

Просто чтобы убедиться, что я создал простое приложение с двумя элементами управления UITextView, установил их делегата в качестве контроллера представления и добавил этот фрагмент кода:

- (void) textViewDidChangeSelection:(UITextView *)textView
{
    NSLog(@"Fire change selection.");
}

Работает нормально как до фонового запуска приложения, так и после возврата из фонового режима.

person memmons    schedule 10.03.2013

Что решило проблему для меня, так это позвонить

[myTextView reloadInputViews]

В методе AppDelegate:

-(void)applicationWillEnterForeground:

Я точно не знаю, почему это работает, поэтому, если у кого-то есть хорошее объяснение, это было бы очень признательно.

person empee    schedule 11.03.2013