Verschiebung viewWillAppear bis webViewDidFinishLoad

8

Ich habe eine Anwendung, die UIWebViews in mehreren View-Controllern verwendet. Die UIWebViews werden verwendet, um lokal generiertes HTML zu rendern, kein langsamer Netzwerkzugriff erforderlich.

Um Speicher zu sparen, lade ich diese nur bei Bedarf, wie vom viewcontroller viewWillAppear Callback aufgefordert. (Und Offscreen-Instanzen als Antwort auf didReceiveMemoryWarning -Nachrichten entladen.)

Das Problem besteht darin, dass der Benutzer sieht, dass der HTML-Code gerendert wird, manchmal begleitet von Styling-Blitzen und anderen unangenehmen Artefakten. Ich würde viel lieber das Rendern außerhalb des Bildschirms machen und die vollständig gerenderte Ansicht zeigen, wenn es fertig ist.

Es wäre sehr ordentlich, die viewWillAppear nicht zurückgeben zu können, bis die UIWebView vollständig gerendert ist. Aber wie?

Ich teile UIWebView mit, was zu rendern ist, indem ich eine loadHTMLString:baseURL: Nachricht sende. Dies ist asynchron und einige Zeit (bald) später wird der Delegierte der Webansicht zurückgerufen webViewDidFinishLoad .

Ich habe mit dem Ausführen eines Runloops in viewWillAppear experimentiert, wobei entweder NSDefaultRunLoopMode oder UITrackingRunLoopMode ausgeführt wurde. Dies funktioniert im Simulator (es beschwert sich im Protokoll

  

[CATransaction synchronize] wird innerhalb der Transaktion

aufgerufen

funktioniert aber), aber auf einem Gerät wird es deadlocks, wobei webViewDidFinishLoad niemals aufgerufen wird.

(Es scheint auch so, als ob die Ladeeigenschaft UIWebView nicht funktioniert. Zumindest, nachdem ich loadHTMLString:baseURL: aufgerufen habe und bevor ich den Callback bekomme, ist das nicht wahr.)

    
cluesque 01.06.2009, 03:01
quelle

2 Antworten

3

Viele Lösungen hier, denke ich. Eine kurze Möglichkeit besteht darin, Ihr UIWebView mit seiner versteckten Eigenschaft auf YES zu laden. Setzen Sie dann Ihren UIViewController als UIWebViews-Delegat und implementieren Sie:

- (void)webViewDidFinishLoad:(UIWebView *)webView

Hier setzen Sie die Eigenschaft zurück auf NEIN.

Beachten Sie, dass webViewDidFinishLoad mehr als einmal ausgelöst wird, wenn Sie einen umrahmten / eingebetteten Inhalt haben. Das musst du also im Auge behalten. Sollte eigentlich kein Problem sein, wenn Sie lokale Inhalte laden.

    
monowerker 01.06.2009 03:38
quelle
0

Ich mag monoekers Lösung am besten, aber eine andere Lösung wäre, das bereits gerenderte UIWebView ständig zu behalten (in einem permanenteren Objekt als dem View-Controller). Ich würde das nur tun, wenn das Aussehen von monoekers Lösung zu störend ist.

    
Rob Napier 02.06.2009 04:41
quelle

Tags und Links