2013-03-27 6 views
11

ich eine App, wo Benutzer einen Stapel von lokal gespeicherten HTML Dateien navigieren können. Ich habe eine UIWebView, richtig konfiguriert mit einer UIWebViewDelegate. Wenn der Benutzer einem Link folgt, wird normalerweise shouldStartLoadWithRequest aufgerufen, gefolgt von webViewDidFinishLoad ein wenig später.UIWebViewDelegate: webViewDidFinishLoad nicht während der in-Seitennavigation genannt

Wenn jedoch der Link auf einen Anker auf der gleichen Seite verweist, der gerade angezeigt wird, wird nur shouldStartLoadWithRequest aufgerufen. webViewDidFinishLoad feuert nicht.

In gewissem Sinne, ich sehe, dass dies Verhalten erwartet werden kann, da In-Page-Navigation kein Seiten-Neuladen erfordern sollte. Allerdings brauche ich wirklich einen Ort, an dem ich mich in den Call-Stack einhaken kann, nachdem die In-Page-Navigation abgeschlossen ist. Die optimale Lösung würde mich wissen lassen, wann irgendeine Art von Navigation beendet wurde, sowohl von einer anderen Seite als auch von In-Page- und Vorwärts-/Rückwärtsaktionen.

Meine beste hackaround bisher war performSelector: withObject: afterDelay: am Ende meiner shouldStartLoadWithRequest Methode, aber ich bin nicht glücklich damit.

Weiß jemand wie ich das richtig lösen kann? Jeder Einblick geschätzt!

+0

Ich sehe nicht, dass die sentainStartLoadWithRequest für Ankerklick aufgerufen wird, nur ganze Seite lädt. Ich bin neugierig, ob sich dieses Verhalten geändert hat, oder wenn nicht, muss ich etwas falsch machen. – Jason

Antwort

8

Sie können versuchen, NSURLConnectionDataDelegate zu verwenden, es ermöglicht Ihnen, eingehende Daten zu verarbeiten. Vielleicht können Sie feststellen, ob die Seite manuell geladen wird, indem Sie ein Zeichen zu Ihren HTML-Dateien hinzufügen.

NSURLConnectionDataDelegate Reference

Edit: gist.github.com/buranmert/7304047 Ich schrieb ein Stück Code, und es hat funktioniert, das ist nicht die Art und Weise sein, können Sie es aber vielleicht hilft es arbeiten wollte. Jedes Mal, wenn ein Benutzer auf eine URL mit einem Anker klickt, erstellt er eine andere Verbindung und lädt die Daten, sobald die Verbindung beendet ist, und lädt die Daten, die den Punkt markieren, an dem die Webansicht die Seite geladen hat. Wie Sie nur lokale HTML-Dateien verwenden, glaube ich nicht, das Erstellen von Verbindungen Probleme

+0

Danke für die Antwort! Die einzige Methode auf dem 'NSURLConnectionDataDelegate', die in meinem Fall ein Potential zu haben scheint, ist' connectionDidFinishLoading'. Wenn Sie die Methodenbeschreibung lesen, klingt das nicht allzu vielversprechend, da es zweifelhaft ist, ob eine In-Page-Navigation eine Ladung auslöst. Ich werde es trotzdem versuchen. – thomax

+0

Yay! Ich habe das funktioniert! Bei weitem die beste Lösung, die hier vorgeschlagen wird, meiner Meinung nach. Vielen Dank, dass Sie sich die Zeit genommen haben, mir zu helfen. Das Kopfgeld gehört dir, guter Herr! – thomax

+0

Eigentlich wäre ein Callback/Hook auf 'webView.renderingFinished' zu 100% perfekt, aber das ist nahe genug. – thomax

1

schaffen Sind Sie sicher, dass Ihr should immer ein JA zurückgibt ???

I

return YES; 

am Ende should implementation.And immer hinzufügen, die für mich funktioniert. Durch die Rückgabe JA, zeigt es, dass die Webansicht geladen ist und die soll nennen würde webViewDidFinishLoad Verhalten

+1

Yepp, ich bin mir sicher. – thomax

6

Was Sie beschreiben. So wie AJAX- oder Ressourcenanforderungen niemals an den Delegaten übergeben werden, werden nur Änderungen an der Stammseite webViewDidFinishLoad: erreichen. Aber ich habe gute Nachrichten und es bedeutet nicht, eine Menge Geld für Autoversicherungen zu sparen.

Die in einem iFrame DO ausgeführten Lasten lösen die vollständigen Delegate-Methoden aus, und das gibt Ihnen eine Lösung. Sie können diesen Mechanismus verwenden, um eine Benachrichtigung an den systemeigenen Code zu senden, so wie es häufig für console.log() wie beschrieben in this post getan wird. Alternativ würde Native Bridge gut funktionieren, um Ihren Objective-C-Code von JavaScript aufzurufen.

+0

+1 Ich bin mir sicher, dass das funktionieren würde, aber es fühlt sich eher wie ein Hack an als der eher iOS-ische Vorschlag von Mert Buran. Vielen Dank fürs Aushelfen! – thomax

1
if([webView isLoading]==1) 
{ 
    //your webview is loading 
} 
else 
{ 
    //your webview has loaded 
} 
+0

Ja, aber das WebView für seinen Ladezustand abzufragen, ist kein OS Callback/Hook, aber das Gegenteil. – thomax

2

Überprüfen Sie einfach Wetter u die Delegatfunktion bekam DidStartLoading wenn es keinen Zweifel, dass DidFinish genannt wird auch

+0

Nein, es wird keine In-Page-Navigation mit einem Fragment in der URL aufgerufen. – thomax

+0

Wetter überprüfen ** webView: shallStartLoadWithRequest: navigationType: ** gibt "NO" zurück, und eine andere Möglichkeit ist, dass webview delegate auf "nil" – Nagaraj

+1

'shouldStartLoadWithRequest'returns' YES' gesetzt ist und der Delegat korrekt eingestellt ist. Dies ist in der Tat die Voraussetzung für meine Frage. – thomax

0

Hier gecallt sollte eine rasche Umsetzung von Mert Buran Code Incase jemand ist auf der Suche nach es. (Obwohl NSURLConnection ab iOS 9 veraltet ist)

Aber es löst nicht mein Problem. Wenn ich auf einen jQuery-Link klicke, der ein Video öffnet, wird das webViewDidFinishLoad nicht ausgelöst.