shr*_*rug 2 uiwebview ios swift
我处理使用UIWebViews呈现内容的iOS项目.我经常需要该内容与本机应用程序进行通信,为此我依赖于有用的WebViewJavascriptBridge.
我开始了一个我希望在Swift中实现的新项目.作为语言的新手,我遇到了正确实现桥梁的问题.虽然我很乐意承认对部分问题缺乏经验,但我也意识到Xcode在某种程度上错误地完成了代码,尤其是在设置Objective-C库使用块的闭包时.
这是我在Objective-C中使用的代码,其中一些Javascript通过字典发送以呈现PDF:
@weakify(self);
self.bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView webViewDelegate:self handler:^(id data, WVJBResponseCallback responseCallback) {
@strongify(self);
if ([data isKindOfClass:[NSDictionary class]]) {
// show a pdf
if ([data[@"type"] isEqualToString:@"pdf"]) {
self.docString = data[@"file"];
self.docTitle = data[@"title"];
[self performSegueWithIdentifier:@"modalPDF" sender:self];
}
}
}];
Run Code Online (Sandbox Code Playgroud)
除了正确设置网桥之外,我还需要确保在Swift中使用弱引用,self就像我在Objective-C代码中所做的那样.
如何在Swift中正确实现桥接?
它花了我一些试验和错误,但我找到了一个运作良好的解决方案.
将WebViewJavascriptBridge添加到我的项目后,我做的第一件事就是在我的项目中创建一个Objective-C Bridging Header并在那里导入类:
#import "WebViewJavascriptBridge.h"
Run Code Online (Sandbox Code Playgroud)
有了这个,我能够使用以下代码初始化桥:
self.bridge = WebViewJavascriptBridge(forWebView: self.webView, webViewDelegate: self) {
[unowned self](data, responseCallback) -> Void in
if let dataObj = data as? Dictionary<String, String> {
if (dataObj["type"] == "pdf") {
self.docString = dataObj["file"]
self.docTitle = dataObj["title"]
self.performSegueWithIdentifier("modalPDF", sender: self)
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,以代替弱引用的self我曾经[unowned self]为苹果记载.