js調用OC代碼

接着上節我們講到的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方法爲  

    testobject.TestOneParameter('參數1')  

那麼 我們在oc中添加的代理方法就爲

-(void)TestOneParameter:(NSString *)message; 


如果js是多個參數的話  我們代理方法的所有變量前的名字連起來要和js的方法名字一樣

比如: js方法爲  

    testobject.TestTowParameterSecondParameter('參數A','參數B')  

他有兩個參數 那麼我們的代理方法 就是把js的方法名 TestTowParameterSecondParameter 任意拆分成兩段作爲代理方法名(此處我們拆分爲 TestTowParameter 和 SecondParameter ) 那麼我們的代理方法就是

-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2; 

我們看代理方法有兩個變量別名

TestTowParameter 和 SecondParameter 

他兩個拼接起來就剛好是我們js的方法名


此處有點繞。我們直接看代碼


首先創建一個類 繼承NSObject 並且規定一個協議

    #import <Foundation/Foundation.h>  
    #import <JavaScriptCore/JavaScriptCore.h>  
      
    //首先創建一個實現了JSExport協議的協議  
    @protocol TestJSObjectProtocol <JSExport>  
      
    //此處我們測試幾種參數的情況  
    -(void)TestNOParameter;  
    -(void)TestOneParameter:(NSString *)message;  
    -(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;  
      
    @end  
      
    //讓我們創建的類實現上邊的協議  
    @interface TestJSObject : NSObject<TestJSObjectProtocol>  
      
    @end  

類的實現

#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加載完成之後調用測試一下


代碼如下:

    -(void)webViewDidFinishLoad:(UIWebView *)webView  
    {  
        //網頁加載完成調用此方法  
          
        //首先創建JSContext 對象(此處通過當前webView的鍵獲取到jscontext)  
        JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];  
          
        //第二種情況,js是通過對象調用的,我們假設js裏面有一個對象 testobject 在調用方法  
        //首先創建我們新建類的對象,將他賦值給js的對象  
          
        TestJSObject *testJO=[TestJSObject new];  
        context[@"testobject"]=testJO;  
          
        //同樣我們也用剛纔的方式模擬一下js調用方法  
        NSString *jsStr1=@"testobject.TestNOParameter()";  
        [context evaluateScript:jsStr1];  
        NSString *jsStr2=@"testobject.TestOneParameter('參數1')";  
        [context evaluateScript:jsStr2];  
        NSString *jsStr3=@"testobject.TestTowParameterSecondParameter('參數A','參數B')";  
        [context evaluateScript:jsStr3];  
          
    }  

結果如下圖


好了 我們看到了結果 三個方法都調用了 

ok兩種方式都完成了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章