如果我想定义一个名字为MineViewController的JS类,代码如下:

defineClass("MineViewController:NJCSBaseViewController", {
  init:function(){
    //doSomething
  },
  viewWillAppear:function(){
    //doSomething
  },
  viewDidAppear:function(){
    //doSomething
  },
  viewWillDisappear:function(){
    //doSomething
  },
  viewDidDisappear:function(){
    //doSomething
  },
  dealloc:function(){
    //doSomething
  }
    });
阅读全文 »

1:现有组件简单介绍
目前已封装的组件有:
NJCSUIView
NJCSUILabel
NJCSUIIconLabel
NJCSUITextField
NJCSUIButton
NJCSUITableView
NJCSUITableViewCell
……

对于已封装组件的使用有两种情况,使用方法也是不同的,下面会逐一介绍:
1-1:有与原生封装组件对应的JS组件

defineClass("NJCSUILabel: NJCSUIView", {
});
defineClass("NJCSUIButton: NJCSUIView", {
});
defineClass("NJCSUIIconLabel: NJCSUIView", {
});
defineClass("NJCSUIImageView: NJCSUIView", {
});
defineClass("NJCSUIWebView: NJCSUIView", {
});
defineClass("NJCSUITableView: NJCSUIView", {
});
defineClass("NJCSUITextField: NJCSUIView", {          
});
defineClass("NJCSUISubView: NJCSUIView", {}, {
    create:function(targetViewClass, instanceName, props){
        var instance = new this();
        instance.className = this.className;
        instance.instanceName = instanceName;
        instance.targetViewClass = targetViewClass;
        return instance;
    }
});

示例代码:

var tableView = NJCSUITableView.create("tableView");//创建实例
this.addElement(tableView);//将示例添加到ViewController中的view内,addElement在被调用的时候才会在Native中创建一个与之对应的Native对象实例,所以只有调用addElement之后,才能调用该实例的方法,否则会因找不到对象而产生异常
tableView.setFrame(NJCSCGRect.create(0, 0, NJCSMacors["mainScreenWidth"], NJCSMacors["screenHeight"] - 50));
tableView.setBackgroundColor(NJCSUIColor_JS.create("#999999:0"));
1-2:只有Native对象而没有与之对应的js对象 示例代码:
var UITableView = getNativeClassWithClassName("UITableView");//根据字符串获取UITableView类
var tableView = UITableView.alloc().init();//初始化UITableView实例
this.view().addSubView(tableView);//获取当前viewController的view 并添加tableView
tableView.setFrame(NJCSCGRect.create(0, 0, NJCSMacors["mainScreenWidth"], NJCSMacors["screenHeight"] - 50));//设置tableView的frame
tableView.setBackgroundColor(NJCSUIColor_JS.create("#999999:0"));//设置tableView的背景颜色
看到这里可能会有人问,既然不封装就能直接使用干嘛要封装一层的,目的何在? 的确所有的组件只要Native内存在的,在js内是可以直接使用的,之所以要封装一层目的是为了在频繁操作某个对象的属性时(如:频繁设置UILabel实例的frame /text/backgroundColer……),减少JS和Native的通信次数,这里先简单提一下,后续在介绍“簇调用”时详细介绍。
阅读全文 »

代码示例:


NJCSVCManager.pushViewControllerDataAnimated(“ZCMCreateDetailCompanyViewController”, null, true);
NJCSVCManager.pushViewControllerDataAnimated(“AuthListViewController”, null, true);
[[NJCSVCManager shareInstance] pushTargetViewController:@”exampJSFile” data:nil animated:YES];

关于NJCS的页面跳转是有NJCSVCManager控制的主要有以下几个方法,下面会一一进行介绍:
1:- (void)pushTargetViewController:(NSString )jsFile data:(id)data animated:(BOOL)flag;
使用情况:跳转到js控制的viewController
调用环境:Native JS
参数说明:
jsFile:与viewController对应的js文件名称
data:viewController初始化时所需数据
animated:是否显示跳转动画
2:- (void)pushViewController:(NSString
)className data:(id)data animated:(BOOL)flag;
使用情况:跳转到Native的ViewController
调用环境:Native JS
参数说明:
className:Native对应的类名字
data:初始化所需数据
animated:是否显示跳转动画
3:- (void)popViewControllerAnimated:(BOOL)flag;
使用情况:弹出当前ViewController
使用环境:Native JS
参数说明:
flag:是否显示跳转动画
阅读全文 »

ViewController创建示例:
1:Native创建NJCSViewController界面


UIViewController *targetViewController = [NJCS creatViewControllerWithSessionName:@”NJCSMineViewController” jsFileName:@”NJCSMineViewController” initData:nil];

使用NJCS类方法:
+ (NJCSBaseViewController )creatViewControllerWithSessionName:(NSString )sessionName jsFileName:(NSString )jsFileName initData:(NSString )initData;
参数介绍:
sessionName:viewController实例名称,须全局唯一
jsFileName:与实例名为sessionName的viewController对应的js文件名称
initData:viewController初始化时所需数据,如从上层界面跳转到当前界面时带过来的,或者接口请求完成后得到数据然后跳转界面时的数据
2:JS创建NJCSViewController界面


NJCSVCManager.pushTargetViewControllerDataAnimated(“targetViewController”, initData, true/false);

js在控制viewCongroller不需要生成ViewController实例,只需通过NJCSVCManager的
- (void)pushTargetViewController:(NSString *)jsFile data:(id)data animated:(BOOL)flag
方法即可,Native会根据相应的参数创建与之对应的viewController,参数介绍:
jsFile:与ViewController对应的js文件名称
data:初始化所需数据
animated:是否有跳转动画

关于ViewController控制相关在【页面跳转】会有详细介绍。

NJCS的接入主要有四个部分:
1:设置异常监听
2:设置JS脚本所在目录(如果不设置将会从Bundle内读取)
3:注入特殊数据类型解析(主要使用于JS在使用原有Native数据时)
4:添加所需扩展(如:网络请求扩展、日志上报扩展、弹窗系统扩展、数据库操作扩展)
接入示例:

[NJCS setExceptionHandler:^(NSDictionary *exceptions) {
#if DEBUG
    NSString *exceptionDesc = [NSString stringWithFormat:@"JSException:name:%@\n message:%@\n script:%@\n line: %@ column: %@\n stack: %@\n", exceptions[@"name"], exceptions[@"message"], exceptions[@"script"], exceptions[@"line"], exceptions[@"column"], exceptions[@"stack"]];
            NSLog(@"%@", exceptionDesc);
#endif
    NSException *exception = [NSException exceptionWithName:[NSString stringWithFormat:@"%@", exceptions[@"name"]] reason:[NSString stringWithFormat:@"%@", exceptions[@"message"]] userInfo:exceptions];
    [Bugly reportException:exception];
}];
NSString *njcsFilesRootURL = @"";
NSInteger njcsVersion = [CommonRemoteFilesManager targetVersion];
if (njcsVersion && njcsVersion > 0) {
    njcsFilesRootURL = [CommonRemoteFilesManager targeFilesPath:[NSString stringWithFormat:@"%ld", njcsVersion]];
}
[NJCS sync:njcsFilesRootURL];
[NJCS registerModelAdapterForType:[JobAuthModelItemAdapter class] type:@"JobAuthModelItemAdapter"];
[NJCS addHttpInterface:[[CommonHTTPTool alloc] init]];

1、[NJCS setExceptionHandler:^(NSDictionary *exceptions) {};设置异常监听,要放在初始化之前,否则初始化时产生的异常就无法监听。
异常大多数需要上报的字段:
exceptions[@”name”]:异常名称
exceptions[@”message”]:异常信息
exceptions[@”script”]:产生异常的脚本
exceptions[@”line”]:异常脚本所在行数
exceptions[@”column”]:异常脚本所在列数
exceptions[@”stack”]:异常调用堆栈
2、[NJCS sync:njcsFilesRootURL]; 设置JS文件所在目录,该目录找不到文件时会从Bundle内读取
3、[NJCS registerModelAdapterForType:[JobAuthModelItemAda;注入某种数据类型解析
4、[NJCS addHttpInterface:[[CommonHTTPTool alloc] init]];添加网络请求扩展,不同的项目可能会有不同的网络请求库,NJCS只是提供了网络请求所需接口,项目在使用时只需按照要求实现接口并在添加进去即可,关于网络请求接口后续扩展部分会有详细介绍。

一、项目需求
无需发布新版本,通过下发JS动态添加或关闭某些功能。
二、使用帮助
1:项目接入
2:页面创建
3:页面跳转

4:使用封装组件
4-1:现有组件介绍

4-2:组件使用与封装
5:JS类的声明
6:方法调用

7:数据模型

这几天在更新博客的时候发现使用命令“hexo d”进行提交时失败,错误提示如下:

INFO  Deploying: git
INFO Clearing .deploy_git folder…
INFO Copying files from public folder…
On branch master
nothing to commit, working directory clean
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
FATAL Something’s wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.html
Error: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

在网上找了很多方法,有git降级的,有重新生成ssh key然后将public key 添加到github上的,几乎所有的都折腾了一边,然并卵……,功夫不负有心人,最后还是搞定了,特此记录一下,以备不时之需。
阅读全文 »

1:NS_ASSUME_NONNULL_BEGIN / NS_ASSUME_NONNULL_END


NS_ASSUME_NONNULL_BEGIN
@Interface People:NSObject
@property (nonatomic, strong) NSString name;
@property (nonatomic, strong) NSString
gender;
@end
NS_ASSUME_NONNULL_END

以上表明属性name和gender是nonnull类型的,在调用[self setName:nil];或者[self setGender:nil]; 编译器会给出警告:Null passed to a callee that requires a non-null argument.
只是一个警告,编译还是可以通过的。
阅读全文 »