NativeScript中如何在Xcode项目中使用自定义Objective-C类
直接调用Objective-C类的方案:不用插件,不用框架
完全不用搞插件那套复杂流程,也不需要把你的Objective-C类打包成框架——你已经把OC类加到Xcode项目目标里了,只要做几步简单配置,就能在NativeScript的JS代码里直接调用它们。
第一步:确保你的OC类对外暴露
NativeScript只能访问公开声明的Objective-C类和方法,所以你需要把MyCustomViewController的接口写到.h头文件里,比如:
#import <UIKit/UIKit.h> @interface MyCustomViewController : UIViewController // 把你要调用的方法都声明在这里,比如你要用的init方法 - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil; @end
如果你的类之前是只在.m里的私有类,一定要把@interface移到.h里,不然NativeScript看不到它。
第二步:让NativeScript生成JS绑定
NativeScript会自动扫描Xcode项目里的OC代码,但有时候需要明确告诉它要处理哪些类。在你的NativeScript项目的App_Resources/iOS目录下,创建一个metadata-generator.json文件,内容如下:
{ "includedClasses": [ "MyCustomViewController" ] }
这个文件会让NativeScript在构建时,专门为MyCustomViewController生成对应的JS调用绑定。
第三步:修正你的JS调用代码
NativeScript对OC方法的命名有转换规则(把冒号去掉,参数按顺序拼接),所以你原来的代码需要调整一下:
// 直接从ios命名空间获取你的自定义类 const MyCustomViewController = ios.MyCustomViewController; // 初始化视图控制器:OC的initWithNibName:bundle:对应JS的initWithNibNameBundle const vc = MyCustomViewController.alloc().initWithNibNameBundle("你的Xib文件名", null); // 展示视图控制器:OC的presentViewController:animated:completion:对应JS的presentViewControllerAnimatedCompletion page.frame.ios.controller.presentViewControllerAnimatedCompletion(vc, true, null);
注意:
- 你的Xib文件要放到
App_Resources/iOS目录下,不然NativeScript找不到它。 - Xib的文件所有者要设置为
MyCustomViewController,不然加载Xib时会出错。
第四步:构建运行
直接运行tns run ios,NativeScript会自动把你的OC类、Xib文件打包到iOS应用里,同时生成绑定代码——这时候你的JS代码就能正常调用自定义视图控制器了。
常见坑提醒
- 如果遇到「找不到类」的错误:检查
.h文件是否正确声明了类、metadata-generator.json里的类名有没有拼写错误。 - 如果Xib加载失败:确认Xib文件名和代码里的一致,文件所有者设置正确,并且Xib已经加到NativeScript的
App_Resources/iOS目录。 - 如果OC类依赖其他资源(比如图片、其他类):确保这些资源也都在Xcode项目目标里,NativeScript会一并打包。
内容的提问来源于stack exchange,提问作者Nicolas Manzini
相关产品推荐
相关产品推荐

