iOS js oc相互調用(JavaScriptCore)(二)

來源:互聯網
上載者:User

標籤:javascript   ios   uiwebview   js和ios互調   

上節地址 http://blog.csdn.net/lwjok2007/article/details/47058101

接著上節我們講到的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 *[email protected]"test1('參數1')";    [context evaluateScript:jsFunctStr];        //二個參數    NSString *[email protected]"test1('參數a','參數b')";    [context evaluateScript:jsFunctStr1];    }

以上代碼中 給test1賦值的block要是執行了那麼結果就是對的,js調用了iOS

我們看結果


我們看到參數被列印出來了,而且一個參數和兩個參數都可以,也符合js參數個數不限制



下來我們看第二種情況 就是js 中是通過一個對象來調用方法的。

此處稍微複雜一點我們需要使用到

JSExport

凡事添加了JSExport協議的協議,所規定的方法,變數等 就會對js開放,我們可以通過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 *[email protected]"testobject.TestNOParameter()";    [context evaluateScript:jsStr1];    NSString *[email protected]"testobject.TestOneParameter('參數1')";    [context evaluateScript:jsStr2];    NSString *[email protected]"testobject.TestTowParameterSecondParameter('參數A','參數B')";    [context evaluateScript:jsStr3];    }


結果如


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

ok兩種方式都完成了


原始碼我們上傳到群空間[TestJSOC.zip]有需要的去下載


蘋果開發群 :414319235  歡迎加入  歡迎討論問題

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

iOS js oc相互調用(JavaScriptCore)(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.