【问题标题】:WKWebView canGoForward always return false swift 5WKWebView canGoForward 总是返回 false swift 5
【发布时间】:2021-10-24 10:04:51
【问题描述】:

我已经实现了 WKWebView,一切都很完美。 canGoBack 值已更改,但 canGoForward 始终返回 false。如果我完全启用强制,那么它可以工作,但是当有任何转发 url 时,我想启用转发按钮。

WKWebView 不包含 webViewDidStartLoadwebViewDidFinishLoad 委托方法,所以我使用 didFinish 方法。它适用于后退按钮但前进按钮不起作用!我已经检查过 StackOverFlow 没有找到 WKWebview 的解决方案。

下面是我的代码:

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void){
        buttonConfiguration(webView: webView)
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        buttonConfiguration(webView: webView)
}

func buttonConfiguration(webView: WKWebView){
        print("Back", webView.canGoBack)
        print("Forward", webView.canGoForward)
        backButton.isEnabled = webView.canGoBack
        forwardButton.isEnabled = webView.canGoForward
}

仅提及代码与此问题相关 谢谢!

【问题讨论】:

  • 你不应该在某个时候给decisionHandler打电话吗?
  • 使用webView(_:didFinish:)确保网页已经加载。
  • @Sweeper 是的,我做了 decisionHandler(.allow)
  • 是的,我提到我使用了 didFinish。我只是想知道如果我刷新屏幕然后它会启用但不会像后退按钮启用那样自动启用。

标签: ios swift webview wkwebview swift5


【解决方案1】:

您可以使用KVO观察canGoBackcanGoForward的变化:

添加观察者:

  self.webView.addObserver(self, forKeyPath: #keyPath(WKWebView.canGoBack), options: .new, context: nil)
        self.webView.addObserver(self, forKeyPath: #keyPath(WKWebView.canGoForward), options: .new, context: nil)

KVO 观察变化(在此处放置启用/禁用按钮逻辑):

 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if let _ = object as? WKWebView {
            if keyPath == #keyPath(WKWebView.canGoBack) {
                print("canGoBack: \(self.webView.canGoBack)")
            } else if keyPath == #keyPath(WKWebView.canGoForward) {
                print("canGoForward: \(self.webView.canGoForward)")
            }
        }
    }

启用allowsBackForwardNavigationGestures

    webView.allowsBackForwardNavigationGestures = true

别忘了删除deinit中的观察者。

【讨论】:

  • 第一次启用两个按钮,所以我需要第一次禁用 didload 中的按钮?
  • deinit { webView.removeObserver(self, forKeyPath: #keyPath(WKWebView.canGoBack)) webView.removeObserver(self, forKeyPath: #keyPath(WKWebView.canGoForward)) } deinit 代码对吗?跨度>
  • 在 viewDidLoad 中添加观察者之前添加这些行:self..isEnabled = self.webView.canGoBack
  • @YogeshPatel canGoForward 也是如此。 “是”的 deinit 代码是正确的。
猜你喜欢
  • 1970-01-01
  • 2012-02-07
  • 2016-07-19
  • 2016-01-15
  • 2016-09-12
  • 2015-12-10
  • 1970-01-01
  • 2017-08-11
相关资源
最近更新 更多