如果我实现 decidePolicyFor navigationAction,WKWebView 为空,如果我删除该功能,则正确加载

WKWebView is empty if I implement decidePolicyFor navigationAction, loads correctly if I remove the function

这是在xcode10.3,swift5

我正在尝试使用 WKWebView 加载一些 Web 内容。我有一个 class 只是 NSObject,它实现了 WKNavigationDelegate class.

如果我包含这个函数:(允许任何)

    public func webView(_ webView: WKWebView,
                        decidePolicyFor navigationAction: WKNavigationAction,
                        decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {

        decisionHandler(.allow)
        return
    }

该页面只加载了一个空的 html 正文,没有显示任何内容。此外,该函数似乎从未以这种方式调用。

如果我注释掉该函数,页面将正常加载。

我难住了!

我试过将包含 webview 的 class 更改为 UIViewController,然后将其添加到主控制器。这样做,决策处理函数确实被调用,但我的 webview 仍然是空的。 (它只要求 about:blank)

// simplified code

public class MyClass : NSObject, WKUIDelegate, WKNavigationDelegate {
    public func load(container:UIView){
        let config = WKWebViewConfiguration()
        config.allowsInlineMediaPlayback = true
        config.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypes.init(rawValue: 0)

        webView = WKWebView(frame:CGRect(x:0, y:0, width:250, height:250), configuration: config) // test rectangle
        webView!.navigationDelegate = self
        webView!.uiDelegate = self
        webView!.isUserInteractionEnabled = true
        container.addSubview(webView!)

        let body = "<div>test</div>"
        webView!.loadHTMLString(body, baseURL:URL(string:"MY_SITE_HERE"))
    }

    public func webView(_ webView: WKWebView,
                        decidePolicyFor navigationAction: WKNavigationAction,
                        decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {

        decisionHandler(.allow)
        return
    }
}


这是怎么发生的: 我的主视图控制器有一个 NSObject 实例,它做了以下简化:


class SDKConsumer : NSObject {

init(parentViewController:ViewController) {
        self.parentViewController = parentViewController
        super.init()
    }

func myFunction(){
        let instance = MyClass()

        instance.load(container:parentViewController!.view)
    }
}

您遇到了内存管理问题。您没有在任何地方保留对 MyObject 实例的强引用。 myFunction 一结束,MyObject 实例就会消失,因为没有强引用。

instance 设为 属性 而不是局部变量,您的问题应该得到解决。