如果我实现了decisionPolicyFor navigationAction,WKWebView 为空,如果我删除该函数,则正确加载

Posted

技术标签:

【中文标题】如果我实现了decisionPolicyFor navigationAction,WKWebView 为空,如果我删除该函数,则正确加载【英文标题】:WKWebView is empty if I implement decidePolicyFor navigationAction, loads correctly if I remove the function 【发布时间】:2019-07-26 00:27:54 【问题描述】:

这是在 xcode 10.3,swift 5 中

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

我创建了 Web 视图 设置navigationDelegate 加载网页视图

如果我包含此功能:(允许任何内容)

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

        decisionHandler(.allow)
        return
    

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

如果我注释掉那个函数,页面会正常加载。

我被难住了!

我尝试将包含 webview 的类更改为 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)
    

【问题讨论】:

展示如何创建和维护对MyClass 的引用。这可能是内存管理问题。 我为此添加了一些细节,不确定是否足够清楚? 【参考方案1】:

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

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

【讨论】:

以上是关于如果我实现了decisionPolicyFor navigationAction,WKWebView 为空,如果我删除该函数,则正确加载的主要内容,如果未能解决你的问题,请参考以下文章

Java过滤器工厂实现

给定一个 n × n 的二维矩阵表示一个图像, 将图像顺时针旋转 90 度js实现

快速 exp 中的 SICP 1.2.4 拼写错误?

实现音节化算法但实际上很慢

java实现经典排序算法

ValueError:形状不匹配:如果类别是一个数组,它必须是形状(n_features,)