JS中通過一個對象來iOS調用方法-JSExport

凡事添加了JSExport協議的協議,所規定的方法變量等,就會對js開放,我們可以通過js調用到

  • 如果js是一個參數或者沒有參數的話,就比較簡單,我們的方法名和js的方法名保持一致即可
    比如: js方法為 (JS內調用)

    testobject.TestOneParameter('參數1')

    那么 我們在oc中添加的代理方法就為(OC內定義)

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

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

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

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

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

首先創建一個類 繼承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];  

}

結果如下圖


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 我們講到的iOS調用js下來我們使用js調用iOSjs調用iOS分兩種情況 一,js里面直接調用方法 二,js里面...
    默默的前行閱讀 884評論 0 1
  • 蘋果公布了JavaScriptCore.framework 它使得JS與OC的交互更加方便了。 一、iOS調用js...
    1d5cb7cff98d閱讀 1,151評論 0 0
  • 跟原生開發相比,H5的開發相對來一個成熟的框架和團隊來講在開發速度和開發效率上有著比原生很大的優勢,至少不用等待審...
    大沖哥閱讀 1,865評論 0 7
  • 隨著H5技術的興起,在iOS開發過程中,難免會遇到原生應用需要和H5頁面交互的問題。其中會涉及方法調用及參數傳值等...
    Chris_js閱讀 3,114評論 1 8
  • iOS開發系列--網絡開發 概覽 大部分應用程序都或多或少會牽扯到網絡開發,例如說新浪微博、微信等,這些應用本身可...
    lichengjin閱讀 3,721評論 2 7