我处理使用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];
}
}
}];
除了正确设置网桥之外,我还需要确保在Swift中使用weak reference到self
,就像我在Objective-C代码中所做的那样。
如何在Swift中正确实现桥接?
答案 0 :(得分:5)
我花了一些试验和错误,但我找到了一个效果很好的解决方案。
将WebViewJavascriptBridge添加到我的项目后,我做的第一件事就是在我的项目中创建Objective-C Bridging Header并在那里导入类:
#import "WebViewJavascriptBridge.h"
有了这个,我可以使用以下代码初始化网桥:
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)
}
}
}
请注意,我使用self
作为documented by Apple代替[unowned self]
的弱引用。