我正在写一个带有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 DispatchGCD)设置计时器事件,然后从计时器事件中触发滚动事件。请注意,您必须在主队列中进行滚动,而计时器事件不在主队列中。只需查看GCD上的文档。见https://developer.apple.com/reference/dispatch

08-05 23:22