Pergunta

Eu tenho um aplicativo que usa UIWebViews em vários controladores de vista. O UIWebViews são usados ??para renderizar HTML gerado localmente, sem acesso à rede lenta necessário.

Para economizar memória Eu só carregá-los sob demanda conforme solicitado pelo viewcontroller viewWillAppear callback. (E descarregar fora da tela casos em resposta a mensagens didReceiveMemoryWarning.)

O problema é que o usuário começa a ver o html que está sendo processado, por vezes acompanhado por flashes de styling e outros artefatos desagradáveis ??variados. Eu prefiro muito mais a prestação ser feito fora da tela, e revelar a visão totalmente renderizado quando o seu pronto.

Seria muito arrumado para ser capaz de ter a viewWillAppear não retornar até que o UIWebView é totalmente processada. Mas como?

Eu digo a UIWebView o que para tornar enviando-lhe uma mensagem loadHTMLString:baseURL:. Esta é assíncrona, e algum tempo (em breve) mais tarde delegado do webview é chamado de volta webViewDidFinishLoad.

Eu experimentei com a execução de um RunLoop dentro viewWillAppear, executando o NSDefaultRunLoopMode ou UITrackingRunLoopMode. Isso funciona no simulador (que reclama com o log

[CATransaction sincronizar] chamado dentro da transação

mas não funciona), mas em um dispositivo que impasses, com webViewDidFinishLoad não sendo chamado.

(Além disso, parece que a propriedade UIWebView de carga não funciona. Pelo menos, depois que eu chamo loadHTMLString:baseURL: e antes de começar o callback que não é verdade.)

Nenhuma solução correta

Outras dicas

Muitas das soluções aqui eu acho. A Quick One é carregar o seu UIWebView com ele está escondido conjunto de propriedades para YES. Em seguida, defina o seu UIViewController como delegado UIWebViews e implementar:

- (void)webViewDidFinishLoad:(UIWebView *)webView

onde você definir a propriedade de volta para NO.

Uma coisa a notar é que webViewDidFinishLoad dispara mais de uma vez se você tiver enquadrado content / incorporado. Então você tem que acompanhar esse. não deve realmente ser um problema se você estiver carregando o conteúdo local.

Eu como solução de monowerker melhor, mas uma outra solução seria a de segurar a UIWebView já prestado todo o tempo (em algum objeto mais permanente do que o controlador de vista). Eu só faria isso se o olhar da solução da monowerker é muito perturbador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top