2016-10-11 2 views
2

Ich schreibe ein kleines MacOS-Programm mit einem WebView, das eine Website lädt. Dies ist eine dieser Websites, die automatisch mehr Inhalt lädt, wenn Sie nach unten blättern. Ich versuche, Code zu schreiben, der ständig zum Ende der Seite scrollt, so dass mehr davon geladen wird und so weiter.Cocoa .scrollToEndOfDocument funktioniert nicht mehr nach dem ersten Versuch

Was ich bisher habe, ist dies:

scrollToBottomTotalTimes = 10 
self.myWebView.mainFrame.load(NSURLRequest(url: NSURL(string: urlString)! as URL) as URLRequest!) 

func webView(_ sender: WebView!, didFinishLoadFor frame: WebFrame!) { 

     var scrollToBottomCurrentTimes = 0 
     while scrollToBottomCurrentTimes != scrollToBottomTotalTimes { 
      scrollToBottomCurrentTimes += 1 
      self.myWebView.scrollToEndOfDocument(self) 
      sleep(2) //give the page some time to load 
     } 
} 

Dieses gut einmal funktioniert: Die Seite geladen wird, es rollt auf den Boden, und der Seite geladen wird.

Danach scrollt das WebView jedoch nicht mehr, obwohl genügend Zeit zum erneuten Laden der Seite vorhanden ist. Die Position auf der Seite bleibt genau wie zuvor.

Ich habe das Gefühl, dass .scrollToEndOfDocument(self) scheint nicht zu erkennen, dass die Webseite länger geworden ist.

Gibt es eine Möglichkeit, '.scrollToEndOfDocument(self)' zu aktualisieren, so dass es weiß, wo der neue untere Rand der Seite ist?

Danke!

Antwort

0

Es scheint mir, dass Sie einen falschen Ansatz verwenden. Vorausgesetzt, dass neuer Inhalt ankommt, können Sie mehrere Anfragen an didFinishLoadFor erhalten. Sie führen jedoch innerhalb der Methode eine Schleife mit einem Schlafmodus innerhalb der Methode aus, der dazu führt, dass Sie die Hauptwarteschlange blockieren und den Ereignismechanismus deaktivieren.

Ich empfehle Ihnen, ein Timer-Ereignis mit Grand Central Dispatch (GCD) einzurichten und dann das Scroll-Ereignis vom Timer-Ereignis auszulösen. Bitte beachten Sie, dass Sie in der Hauptwarteschlange scrollen müssen und das Timer-Ereignis nicht in der Hauptwarteschlange ist. Schauen Sie sich einfach die Dokumentation unter GCD an. Siehe https://developer.apple.com/reference/dispatch.

Verwandte Themen