Отсрочка viewWillAppear до webViewDidFinishLoad - PullRequest
8 голосов
/ 01 июня 2009

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

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

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

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

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

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

[CATransaction синхронизации] вызывается в транзакции

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

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

Ответы [ 2 ]

3 голосов
/ 01 июня 2009

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

- (void)webViewDidFinishLoad:(UIWebView *)webView

, где вы устанавливаете свойство обратно в NO.

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

0 голосов
/ 02 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...