Хобрук: Ваш путь к мастерству в программировании

Исключение UIWebView для [WebActionDisablingCALayerDelegate setBeingRemoved:]

При работе с iOS 8 я начал видеть следующее исключение, исходящее из глубоких недр UIWebView:

[WebActionDisablingCALayerDelegate setBeingRemoved:]: нераспознанный селектор отправлен экземпляру 0x167ee900

* WebKit отклонил необработанное исключение в webView:willRemoveScrollingLayer:withContentsLayer:forNode: delegate: -[WebActionDisablingCALayerDelegate setBeingRemoved:

Это происходит, когда я изменяю некоторые ограничения на моем UIWebView, а затем вызываю:

 self.webViewWidthConstraints.constant = newWidth;
 [self.webView setNeedsLayout];
 [self.webView layoutIfNeeded];

(Это делается для того, чтобы содержимое веб-просмотра повторно отображалось, чтобы соответствовать его ширине).

К счастью, исключение отбрасывается, поэтому приложение не падает. Почему это происходит, и есть ли способ предотвратить это?


  • У меня такое же исключение в приложении Cordova с iframe. 24.09.2014
  • Ага с кордовой((( 24.09.2014
  • То же самое. Кордова не используется. Это исключение возникает при отображении простого веб-представления в виде модального представления и повороте устройства (только для iOS8, работает в iOS7) 26.09.2014
  • Итак, я исправил проблемы для себя - проблема была в JS с вычислением ширины для одного из текстовых полей. 01.10.2014
  • В настоящее время я использую это правило исключения для точки останова на objc_exception_throw, чтобы эти исключения не приостанавливали отладчик: !(BOOL)[[причина $r0] hasPrefix:@-[WebActionDisablingCALayerDelegate setBeingRemoved:]] 06.10.2014

Ответы:


1

Я обнаружил это, добавив "-webkit-transform: translateZ(0px);" к прокручиваемому содержимому (у меня есть div внутри моего прокручиваемого контейнера), это решило проблему для меня. Надеюсь это поможет.

07.11.2014
  • Я поместил это на свой тег body, и это все исправило. 20.05.2015
  • Поскольку вы не можете попросить Всемирную паутину добавить -webkit-transform, решение заключается в переходе на WKWebView, поскольку UIWebView, по сути, устарело. 08.05.2016

  • 2

    Не уверен, что это ваш случай, но я также начал замечать эту проблему на iOS 8, и мы отследили ее до использования следующего свойства CSS в iframe:

    -webkit-overflow-scrolling: touch;
    

    После того, как мы удалили его, у нас больше не было этих сообщений об ошибках.

    Примечание: в моем случае это произошло не в ответ на изменение каких-либо ограничений, а скорее во время навигации по HTML.

    07.10.2014
  • В моем случае это происходило, когда в одном веб-просмотре присутствовало два или более элемента <div> со свойством -webkit-overflow-scrolling: touch;. 07.10.2014

  • 3

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

    Сначала я предоставил простую функцию:

    id setBeingRemoved(id self, SEL selector, ...)
    {
       return nil;
    }
    

    Затем эти две строки:

        Class class = NSClassFromString(@"WebActionDisablingCALayerDelegate");
        class_addMethod(class, @selector(setBeingRemoved:), setBeingRemoved, NULL);
    

    И это работает.

    26.11.2015
  • Пожалуйста, не могли бы вы предоставить более подробную информацию об этой реализации? Я пытался реализовать это и столкнулся с кучей проблем. Спасибо 20.01.2016
  • Привет! какие именно детали вам нужны? 20.01.2016
  • Мне нужно переопределить больше методов, по крайней мере, в iOS 8.4.1. См. эту вставку. По крайней мере, кажется, что он не падает сейчас. Я почти "отключил" все методы в этом делегате 20.01.2016
  • извини, я тебя не понимаю. Вы все делаете правильно. в чем твоя проблема? 20.01.2016
  • Иногда он вызывает новые функции. Теперь он работает. Не стесняйтесь обновить свой ответ с помощью моего кода. Спасибо Андрей :) 20.01.2016
  • После использования этого в течение 2,5 лет наше последнее обновление приложения было отклонено из-за этого. К счастью, в последних iOS-SDK это больше не требуется. 19.02.2018

  • 4

    Используйте WKWebView вместо UIWebView . (впервые он был включен в iOS 8). Я пробовал, и кажется, что у него нет этой ошибки. Кроме того, он может улучшить производительность по сравнению с предшественником. Вполне вероятно, что Apple сделает стандарт де-факто в ближайшем будущем, если не сейчас. Он имеет интерфейсы и делегаты, несколько похожие на UIWebView. Определенно стоит попробовать.

    Если вы ориентируетесь на пред-iOS 8, вы можете реализовать резервные процедуры для загрузки либо UIWebView, либо WKWebView, здесь нестандартная реализация

    20.01.2016

    5

    В моем случае проблема заключалась в «таблице» внутри содержимого iframe. Ширина таблицы была больше, чем ширина iframe, определенная с помощью CSS. Прокрутка iframe была отключена, и таблица растянула iframe до минимальной расчетной ширины таблицы. Другой побочный эффект: содержимое iframe не было полностью видно (обрезано с правой стороны).

    |--- Available viewport width -------------|
    |--- defined and estimated iframe width ---|
    |--- table width in the iframe content > than defined iframe width ---|
    |--- iframe stretched to the calculated table width ------------------|
    

    Удаление содержимого таблицы формы iframe устранило проблему.

    02.06.2015

    6

    Как ответил @André Morujão, удаление -webkit-overflow-scrolling:touch; из элемента прокрутки останавливает исключение. Но я обнаружил, что исключение происходит только тогда, когда я добавляю display:none css к элементу прокрутки.

    Изменить: я смог продолжить использовать display:none, чтобы скрыть свой элемент прокрутки, поместив -webkit-overflow-scrolling:touch; внутри своего собственного класса .scroll и используя jquery для добавления и удаления этого класса из моего элемента прокрутки до и после его скрытия:

    <style>
        .scroll
        {
             -webkit-overflow-scrolling:touch;
        }
    </style>
    <script>
    function hide()
    {
        $('#scrolling_element).removeClass('scroll');
        $('#scrolling_element).css('display', 'none');
    }
    function show()
    {
        $('#scrolling_element).css('display', 'block');
        $('#scrolling_element).addClass('scroll');
    }
    </script>
    
    23.09.2015
    Новые материалы

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

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..