接着上節我們講到的iOS調用js
下來我們使用js調用iOS
js調用iOS分兩種情況
一,js裏面直接調用方法
二,js裏面通過對象調用方法
首先我們看第一種,直接調用方法。
其中用到了iOS的block
上代碼
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
//網頁加載完成調用此方法
//iOS調用js
//首先創建JSContext 對象(此處通過當前webView的鍵獲取到jscontext)
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//js調用iOS
//第一種情況
//其中test1就是js的方法名稱,賦給是一個block 裏面是iOS代碼
//此方法最終將打印出所有接收到的參數,js參數是不固定的 我們測試一下就知道
context[@"test1"] = ^() {
NSArray *args = [JSContext currentArguments];
for (id obj in args) {
NSLog(@"%@",obj);
}
};
//此處我們沒有寫後臺(但是前面我們已經知道iOS是可以調用js的,我們模擬一下)
//首先準備一下js代碼,來調用js的函數test1 然後執行
//一個參數
NSString *jsFunctStr=@"test1('參數1')";
[context evaluateScript:jsFunctStr];
//二個參數
NSString *jsFunctStr1=@"test1('參數a','參數b')";
[context evaluateScript:jsFunctStr1];
}
以上代碼中 給test1賦值的block要是執行了那麼結果就是對的,js調用了iOS
我們看結果
我們看到參數被打印出來了,而且一個參數和兩個參數都可以,也符合js參數個數不限制
下來我們看第二種情況 就是js 中是通過一個對象來調用方法的。
此處稍微複雜一點我們需要使用到
JSExport
凡事添加了JSExport協議的協議,所規定的方法,變量等 就會對js開放,我們可以通過js調用到
如果js是一個參數或者沒有參數的話 就比較簡單,我們的方法名和js的方法名保持一致即可
比如: js方法爲
那麼 我們在oc中添加的代理方法就爲
-(void)TestOneParameter:(NSString *)message;
如果js是多個參數的話 我們代理方法的所有變量前的名字連起來要和js的方法名字一樣
比如: js方法爲
他有兩個參數 那麼我們的代理方法 就是把js的方法名 TestTowParameterSecondParameter 任意拆分成兩段作爲代理方法名(此處我們拆分爲 TestTowParameter 和 SecondParameter ) 那麼我們的代理方法就是
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
我們看代理方法有兩個變量別名
TestTowParameter 和 SecondParameter
他兩個拼接起來就剛好是我們js的方法名
此處有點繞。我們直接看代碼
首先創建一個類 繼承NSObject 並且規定一個協議
類的實現
#import "TestJSObject.h"
@implementation TestJSObject
//一下方法都是隻是打了個log 等會看log 以及參數能對上就說明js調用了此處的iOS 原生方法
-(void)TestNOParameter
{
NSLog(@"this is ios TestNOParameter");
}
-(void)TestOneParameter:(NSString *)message
{
NSLog(@"this is ios TestOneParameter=%@",message);
}
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2
{
NSLog(@"this is ios TestTowParameter=%@ Second=%@",message1,message2);
}
@end
下面我們在weibview加載完成之後調用測試一下
代碼如下:
結果如下圖
好了 我們看到了結果 三個方法都調用了
ok兩種方式都完成了