swift 与JS交互( JS调用swift方法)

1.首先创建一个代理方法继承JSExport

里面实现的方法是js需要调用swift的方法

@objc protocol JavaScriptSwiftDelegate: JSExport {
    func method(str:String) //带参数的
    func method2()//不带参数
}

2.创建一个model继承NSObject 并遵守上面的协议 实现协议要求的方法

在model里面声明两个block便于参数的传出

@objc class SwiftJavaScriptModel: NSObject, JavaScriptSwiftDelegate {
    weak var jsContext: JSContext?
    typealias customeBlock = (str: String )->Void
    typealias customeBlock2 = ()->Void
    var block:customeBlock?
    var block2:customeBlock2?

    func method(str: String) {
      block(str:str)
    }
    func method2(){
       block2()
    }
}

3.让swift 的webView实现UIWebViewDelegate,

yourweb.delegate = self

4.实现webVeiw的代理方法 在webViewDidFinishLoad的代理方法里进行交互

let context=webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as? JSContext
 let model = SwiftJavaScriptModel()
 model.controller = self
 model.jsContext = context
 model.block = {
    //实现对应的操作 调用swift的方法
}
 self.jsContext = context
 //下面的方法是把model 注入js里面  native是js里面方法的前缀 比如js里面的方法是
 //native.method()
 self.jsContext?.setObject(model, forKeyedSubscript: "native")
 let url = NSBundle.mainBundle().URLForResource("html路径", withExtension: "html")
 self.jsContext.evaluateScript(try?String.init(contentsOfURL: url!))

你可能感兴趣的:(swift 与JS交互( JS调用swift方法))