上篇文章中講述瞭如何通過代碼直接用JavaScript調用Objective-C方法,本文通過另一種思路實現,即通過稍微複雜的一種方法,即通過一個對象來調用方法,該方法通過實現一個協議來操作,即JSExport協議
JSEXport,凡是添加了JSEXPort協議的協議,所規定的方法,變量等,就會對JS開放,我們都可以通過JS的類調用到。
比如:JS方法爲account.account('參數'),我們在OC中添加的代理方法爲:-(void)account:(nsstring *)account;
如果js是多個參數的話 我們代理方法的所有變量前的名字連起來要和js的方法名字一樣,
例如: js方法爲 :testobject.TestTowParameterSecondParameter('參數A','參數B')
他有兩個參數 那麼我們的代理方法 就是把js的方法名 TestTowParameterSecondParameter 任意拆分成兩段作爲代理方法名(此處我們拆分爲 TestTowParameter 和 SecondParameter ) 那麼我們的代理方法就是
-(void)TestTowParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
我們看代理方法有兩個變量別名
TestTowParameter 和 SecondParameter
他兩個拼接起來就剛好是我們js的方法名,這部分是參考別人博客看的功能,沒有實際操作,讀者若有需要,可以自己嘗試下。
下邊詳細講述下操作
1:首先創建一個類,繼承與NSObject,規定一個協議,在該類中導入頭文件#import <JavaScriptCore/JavaScriptCore.h>
1.1:創建協議
#import <JavaScriptCore/JavaScriptCore.h>
/ /首先創建一個實現了JSExport協議的協議
@protocol JSObjectProtocol <JSExport>
//此處我們測試幾種參數的情況
-(void)JSNOParamr;
-(void)JSOneParameter:(NSString *)message;
-(void)JSTwoParameter:(NSString *)message1 SecondParameter:(NSString *)message2;
@end
//讓我們創建的類實現上邊的協議
@interface TestJSObject : NSObject<JSObjectProtocol>
@end
.m文件爲對應的實現
2:具體的調用
還是和之前的一樣,首先創建JSContext對象:
JSContext *context=[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
js是通過對象調用的,我們假設js裏面有一個對象 jsCallOC在調用方法
首先創建我們新建類的對象,將他賦值給js的對象
JSObjectProtocol * ocJs = [[JSObjectProtocol alloc]init];
context[@"jsCallOC"] = ocJS//該處代碼將我們自己實現了協議的類的對象賦值給js的類,讓js的類通過方法調用,
這個時候可以執行js的代碼了,js中的對象名字要和該名稱相同,不然沒法調用,這個時候在oc的類中打斷點,會發現掉用來該方法,如是,則實現了另外一種JavaScript調用Objective-C的方法