Отсрочка viewWillAppear до тех пор, пока webViewDidFinishLoad

StackOverflow https://stackoverflow.com/questions/933414

  •  06-09-2019
  •  | 
  •  

Вопрос

У меня есть приложение, которое использует UIWebViews в нескольких контроллерах представления.А UIWebViews используются для рендеринга локально сгенерированного HTML, не требуется медленный доступ к сети.

Чтобы сэкономить память, я загружаю их только по требованию, как того требует контроллер представления. viewWillAppear перезвонить.(И выгружать закадровые экземпляры в ответ на didReceiveMemoryWarning Сообщения.)

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

Было бы очень здорово иметь возможность viewWillAppear не возвращаться до тех пор, пока UIWebView не будет полностью отображен.Но как?

Я говорю UIWebView что визуализировать, отправив ему loadHTMLString:baseURL: сообщение.Это асинхронно, и через некоторое время (скоро) делегат веб-просмотра вызывается обратно. webViewDidFinishLoad.

Я экспериментировал с запуском цикла выполнения внутри viewWillAppear, запустив либо NSDefaultRunLoopMode или UITrackingRunLoopMode.Это работает в симуляторе (он жалуется в журнал

[CATransactionsync] вызывается внутри транзакции

но работает), но на устройстве происходит взаимоблокировка, с webViewDidFinishLoad никогда не звонят.

(Кроме того, похоже, что UIWebView загрузка свойства не работает.По крайней мере, после того, как я позвоню loadHTMLString:baseURL: и до получения обратного вызова это неправда.)

Нет правильного решения

Другие советы

Я думаю здесь много решений.Самый быстрый способ — загрузить ваш UIWebView со скрытым свойством, для которого установлено значение YES.Затем установите свой UIViewController в качестве делегата UIWebViews и реализуйте:

- (void)webViewDidFinishLoad:(UIWebView *)webView

где вы устанавливаете свойство обратно на НЕТ.

Следует отметить, что webViewDidFinishLoad будет срабатывать более одного раза, если у вас есть фреймовый/встроенный контент.Так что вам придется за этим следить.На самом деле это не должно быть проблемой, если вы загружаете локальный контент.

Мне больше всего нравится решение monowerker, но другим решением было бы постоянно удерживать уже отрисованный UIWebView (в каком-то более постоянном объекте, чем контроллер представления).Я бы сделал это только в том случае, если внешний вид решения monowerker окажется слишком разрушительным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top