我正在写一个带有webview的小型macos程序,它可以加载一个网站。这是当你滚动到底部时自动加载更多内容的网站之一。作为一个到期日,我试图编写代码,不断滚动到页面底部,以便加载更多的代码,等等。
到目前为止我得到的是:
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
}
}
这一次工作得很好:页面加载,滚动到底部,更多的页面加载。
但是在那之后,尽管页面有足够的时间重新加载,webview不再滚动。页面上的位置保持不变。
我觉得
.scrollToEndOfDocument(self)
似乎没有察觉到网页变长的事实。有没有办法“更新”
.scrollToEndOfDocument(self)
以便它知道页面的新底部在哪里?谢谢!
最佳答案
在我看来你用错了方法。假设新内容到达,您可能会收到多个didFinishLoadFor
请求。但是,您在方法内部执行循环,在方法内部执行睡眠,这将使您阻塞主队列并禁用事件机制。
我建议您使用Grand Central Dispatch
(GCD
)设置计时器事件,然后从计时器事件中触发滚动事件。请注意,您必须在主队列中进行滚动,而计时器事件不在主队列中。只需查看GCD
上的文档。见https://developer.apple.com/reference/dispatch。