Frage

Ich habe eine Anwendung, die UIWebViews in mehrere View-Controller verwendet. Die UIWebViews verwendet wird lokal generierten HTML zu rendern, kein langsamer Netzwerk-Zugang erforderlich.

Um Speicherplatz zu sparen ich diese nur bei Bedarf geladen werden, wie durch den Viewcontroller viewWillAppear Rückruf aufgefordert werden. (Und Off-Screen-Instanzen in Reaktion entladen Nachrichten didReceiveMemoryWarning.)

Das Problem ist, dass der Benutzer die HTML gerendert wird, manchmal durch Blitze Styling und verschiedene andere unangenehme Artefakte begleitet zu sehen bekommt. Ich würde viel lieber die Rendering-Off-Screen erfolgen, und zeigen die vollständig gerenderte Ansicht, wenn sein bereit.

Es wäre sehr ordentlich sein, um die viewWillAppear haben nicht zurückkehren, bis die UIWebView vollständig wiedergegeben. Aber wie?

Ich sage dem UIWebView was durch Senden einer Nachricht loadHTMLString:baseURL: zu machen. Dies ist asynchron, und einige Zeit (bald) später die Delegierten Webansicht wird webViewDidFinishLoad genannt zurück.

Ich experimentierte mit einer Runloop innerhalb viewWillAppear ausgeführt wird, entweder die NSDefaultRunLoopMode oder UITrackingRunLoopMode läuft. Dies funktioniert im Simulator (es beschwert sich in das Protokoll

  

[CATransaction Synchronize] innerhalb Transaktion aufgerufen

aber funktioniert), sondern auf einem Gerät Deadlocks es, mit webViewDidFinishLoad nie aufgerufen wird.

(Auch scheint es, wie der UIWebView Ladegut nicht funktioniert. Zumindest nach nenne ich loadHTMLString:baseURL: und vor dem Rückruf bekommt es nicht wahr ist.)

Keine korrekte Lösung

Andere Tipps

Viele Lösungen hier denke ich. Ein schneller ist Ihr UIWebView laden damit auf YES versteckte Eigenschaft festgelegt ist. Dann stellen Sie Ihre UIViewController als UIWebViews delegieren und implementieren:

- (void)webViewDidFinishLoad:(UIWebView *)webView

, wo Sie die Eigenschaft wieder auf NO.

Eine Sache zu beachten ist, dass webViewDidFinishLoad mehr anspringt als einmal, wenn Sie gestaltet haben / eingebetteten Inhalt. So haben Sie den Überblick über diese zu halten. Sollte nicht wirklich ein Problem sein, wenn Sie lokale Inhalte geladen werden.

Ich mag monowerker-Lösung am besten, aber eine andere Lösung würde auf die bereits gerenderte UIWebView die ganze Zeit (in einigen dauerhaftere Objekt als die View-Controller) zu halten sein. Ich würde das nur tun, wenn das Aussehen der monowerker-Lösung zu störend ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top