Отсрочка viewWillAppear до тех пор, пока webViewDidFinishLoad
Вопрос
У меня есть приложение, которое использует 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 окажется слишком разрушительным.