Ошибка UIWindow endDisablingInterfaceAutorotationAnimated появляется в консоли, когда клавиатура отклоняется в интерактивном режиме из collectionView только в iOS9

Я получаю эту странную ошибку только в iOS 9:

[UIWindow endDisablingInterfaceAutorotationAnimated:] called on UITextEffectsWindow: ...without matching
-beginDisablingInterfaceAutorotation. Ignoring.

Каждый раз, когда я отключаю клавиатуру в интерактивном режиме, перетаскивая ее из моего collectionView. Я не получаю ошибку, закрывая клавиатуру жестом касания или нажимая клавишу ввода. Это очень расстраивает. Даже если я не наблюдаю никаких уведомлений клавиатуры, я все равно получаю эту ошибку при закрытии этой интерактивной клавиатуры. Интересно, сталкивался ли кто-нибудь с этой ошибкой и нашел ли решение. У меня есть inputAccessoryView, состоящий из textView, установленного на клавиатуре.


person alionthego    schedule 11.10.2015    source источник
comment
Я тоже это вижу. Возможно, стоит упомянуть только об iOS 9. Запуск того же приложения на iOS 8 ничего не печатает в консоли.   -  person user3099609    schedule 15.10.2015
comment
Спасибо за ваш комментарий. Вы правы в том, что это происходит только в iOS9. Я изменил вопрос, чтобы отразить это.   -  person alionthego    schedule 16.10.2015
comment
Это явно системный баг   -  person Sea Coast of Tibet    schedule 09.06.2016
comment
Все еще получаю это на iOS 10.   -  person Genki    schedule 13.10.2016
comment
Я получаю это на iOS 11 при пролистывании tableView UISearchResultsController... Приложение аварийно завершает работу после нажатия на ячейку после возникновения этой ошибки   -  person user2387149    schedule 14.12.2017


Ответы (3)


У меня была такая же проблема на iOS9, но с tableView. Я реализовал это вместе с self.tableView.keyboardDismissMode = .Interactive, и у меня это сработало.

// Dismiss keyboard when scrolling
func scrollViewWillBeginDragging(scrollView: UIScrollView) {
    textView.resignFirstResponder()
}
person vandit    schedule 05.12.2015
comment
У меня была такая же проблема, когда на моем поле был inputAccessoryView. Прятались в 2 этапа: клавиатура и после этого inputAccessoryView. Это помогло мне. Теперь они прячутся одновременно. - person Gleb Tarasov; 19.12.2015
comment
это работает и для меня с моим collectionView. Спасибо большое. - person alionthego; 07.05.2016
comment
С тех пор, как я принял это предложение, я заметил, что бывают случаи, когда inputAccessoryView фактически исчезает, поэтому мне придется продолжать поиск решения. - person alionthego; 23.05.2016
comment
@izilotti, у меня это работает, но я изменил textView.resignFirstResponder() на view.endEditing(true), потому что у меня 5 текстовых полей. Надеюсь, это может помочь кому-то еще - person Santiago Carmona González; 09.07.2016
comment
Я заметил, используя это предложение, что Dismiss Interactively становится своего рода Dismiss on Drag (у которого в любом случае есть такая же проблема с ошибкой), это не позволит пользователю передумать и отменить операцию закрытия клавиатуры (и потерять выбор), когда перетаскивание. - person Cue; 28.07.2016
comment
НО никакого эффекта .interactive после этого кода, а ваш код очень классный. - person BollMose; 13.10.2017

Что нужно проверить

Похоже, что несколько других пользователей SO имели подобный опыт в различных условиях. Ознакомьтесь с этой темой. Поскольку может произойти много вещей, которые вызывают эту проблему, вы можете просмотреть предоставленную ветку, чтобы узнать, сможете ли вы найти подходящий вариант использования. Неясно, как вы отклоняете клавиатуру, но вы можете вызвать что-то подобное из метода или как распознаватель жестов (а не прямое отключение от определенного объекта):

UIApplication.sharedApplication().sendAction("resignFirstResponder", to: nil, from: nil, forEvent: nil)

Судя по предоставленной ветке, характер проблемы в большинстве случаев заключался в дублировании вызова во время представления или отклонения представления. Я также видел проблемы, когда у меня был подключен переход раскадровки (или в некоторых случаях он был удален, но xml все еще был в представлении кода раскадровки) и переход на основе кода (performSegueWithIdentifier...) для той же анимации (которая вызывает два вызова display/dismiss).

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

ОБНОВЛЕНИЕ

Комментарии от OP напомнили мне, что в некоторых случаях, особенно в тех, которые связаны с вызовами во время презентаций/увольнений, я видел случаи, когда единственный способ успешно заставить функцию разработчика работать — это обернуть ее в вызов dispatch_async. Есть некоторые критические системные вызовы, которые, по-видимому, не работают должным образом, если код разработчика вводится в одних и тех же кадрах.

Конкретным примером является этот вызов, который находится в пределах willMoveToWindow. В этом случае у меня есть ссылка weakSelf на представление, и я просто просматриваю значение newWindow для нулевого значения (указывает, что представление отклоняется) перед вызовом моего кода.

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

 dispatch_async(dispatch_get_main_queue(), { () -> Void in

     //the saved flag is true only when user hits the done button
     if !(weakSelf!.saved) {
         weakSelf?.completeNotes(nil)
     }

 })
person Tommie C.    schedule 25.11.2015
comment
Здравствуй. спасибо за ваш пост я считаю, что дублирующийся вызов связан с inputAccessoryView. кажется, что с установленным inputAccessoryView уведомление keyboardDidChange отправляется дважды каждый раз, когда клавиатура отображается или скрывается. как если бы сначала закрывалась клавиатура, а затем отображался inputAccessoryView. я думаю, что это вызывает эту и некоторые другие проблемы, но не уверен, как это обойти, если мне нравится продолжать использовать inputAccessoryView. - person alionthego; 05.12.2015
comment
Я думал, что ошибка связана с использованием интерактивного отклонения, но в моем случае я отследил эту ошибку до ручного вызова resignFirstResponder для текстового представления. Отправка действия resignFirstResponder вверх по дереву респондента не предотвращает ошибку, но, по крайней мере, мой входной вспомогательный вид правильно удаляется с экрана. Мне интересно, имеет ли это какое-либо отношение к тому факту, что мой входной вспомогательный вид сохраняет (строгую) ссылку на текстовый вид... будет исследовать и сообщать о любой новой информации. - person MathewS; 18.01.2017
comment
Это должен быть выбранный ответ. В частности, обновление о том, что действия разработчика должны быть в асинхронном блоке (или в настоящее время в блоке отсрочки) во время системных событий, имеет смысл и решило мою проблему. - person Alan; 12.09.2018

Я столкнулся с этой проблемой, и это портит мое представление. Вот как я это решаю.

У меня была презентация viewController textFieldShouldBeginEditing. В viewController textField было установлено на becomeFirstResponder в viewDidLoad.

Решение для меня состоит в том, чтобы переместить becomeFirstResponder в viewDidAppear.

person okysabeni    schedule 20.10.2016
comment
Я получил сообщение об ошибке, несмотря на то, что я сделал вызов becomeFirstResponder в viewDidAppear. - person turingtested; 08.12.2016