如果我实现 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
设为 属性 而不是局部变量,您的问题应该得到解决。
这是在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
设为 属性 而不是局部变量,您的问题应该得到解决。