在Cocos2d-JS v3.0 RC2中掩浙,與Android上js調(diào)用Java一樣夜焦,Cocos2d-JS也提供了在iOS和Mac上js直接調(diào)用Objective-C的方法虹蓄,示例代碼如下:
var ret = jsb.reflection.callStaticMethod(className, methodNmae, arg1, arg2, .....);
在jsb.reflection.callStaticMethod
方法中池凄,我們通過傳入OC的類名枣察,方法名魄眉,參數(shù)就可以直接調(diào)用OC的靜態(tài)方法砰盐,并且可以獲得OC方法的返回值。
類
參數(shù)中的類名坑律,只需要傳入OC中的類名即可岩梳,與Java不同,類名并不需要路徑晃择。比如你在工程底下新建一個類NativeOcClass冀值,只要你將他引入工程,那么他的類名就是NativeOcClass藕各,你并不需要傳入它的路徑池摧。
import <Foundation/Foundation.h>
@interface NativeOcClass : NSObject
+(BOOL)callNativeUIWithTitle:(NSString *) title andContent:(NSString *)content;
@end
方法
js到OC的反射僅支持OC中類的靜態(tài)方法。
方法名比較要需要注意激况,我們需要傳入完整的方法名作彤,特別是當某個方法帶有參數(shù)的時候,你需要將他的:
也帶上乌逐。根據(jù)上面的例子竭讳。此時的方法名字是callNativeUIWithTitle:andContent:
,不要漏掉了他們之間的:
浙踢。
如果是沒有參數(shù)的函數(shù)绢慢,那么他就不需要:
,如下代碼,他的方法名是callNativeWithReturnString
洛波,由于沒有參數(shù)胰舆,他不需要:
,跟OC的method寫法一致蹬挤。
+(NSString *)callNativeWithReturnString;
使用示例
下面的示例代碼將調(diào)用上面NativeOcClass
的方法缚窿,在js層我們只需要這樣調(diào)用:
var ret = jsb.reflection.callStaticMethod("NativeOcClass","callNativeUIWithTitle:andContent:","cocos2d-js","Yes! you call a Native UI from Reflection");
這里是這個方法在OC的實現(xiàn),可以看到是彈出一個native的對話框焰扳。并把title和content設(shè)置成你傳入的參數(shù)倦零,并返回一個boolean類型的返回值误续。
+(BOOL)callNativeUIWithTitle:(NSString *) title andContent:(NSString *)content{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:content delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
[alertView show];
return true;
}
此時,你就可以在ret中接受到從OC傳回的返回值(true)了扫茅。
注意
在OC的實現(xiàn)中蹋嵌,如果方法的參數(shù)需要使用float、int葫隙、bool的栽烂,請使用如下類型進行轉(zhuǎn)換:
float,int 請使用NSNumber類型
bool請使用BOOL類型停蕉。
例如下面代碼愕鼓,我們傳入2個浮點數(shù)钙态,然后計算他們的合并返回慧起,我們使用NSNumber而不是int、float去作為參數(shù)類型册倒。
+(float) addTwoNumber:(NSNumber *)num1 and:(NSNumber *)num2{
float result = [num1 floatValue]+[num2 floatValue];
return result;
}
目前參數(shù)和返回值支持 int, float, bool, string蚓挤,其余的類型暫時不支持。