如果我实现了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 为空,如果我删除该函数,则正确加载的主要内容,如果未能解决你的问题,请参考以下文章