Adiando viewWillAppear até webViewDidFinishLoad
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.