最近ずっとTitaniumの開発を触っている。Titaniumを利用してアプリを作る資料が多かったが、module作成についてはかなり資料が少ない気がする。忘れないために、ここに書き残っておく。
Titaniumをdownloadし、installした後、新規module projectから新しいmoduleを作成し始める。wizardに従って、projectを作成した後、x-code projectが自動に生成する。しかし、作成されたx-code projectが直ぐにコンパイルができない、titanium.xcconfigファイルにtitaniumのpath環境設定の方を確認することがある。moduleにSecurity.frameworkを使う場合、module.xcconfigに
OTHER_LDFLAGS =$(inherited) -framework Security
を追加する。 整った後、moduleのObjective-C codeを作成します。
- [TiModule]
defaultとして、TiModuleを承継したクラスが既に自動作成されている。簡単なmethodであれば、このクラスにmember methodを追加して、javascript側から下記の様に使われます。
var Module = require('xxxModuleId');
Module.xxxMethod(args);
- [TiProxy]
moduleをオブジェクト指向に作りたい場合、TiProxyを承継してクラスを作る作成されたクラスがjavascript側にオブジェクトとして作成られる。referenceに従って、propertyが、member mothodが作った後こうやって利用する。
var Module = require('xxxModuleId');
var proxy = Module.createXXXProxy();
proxy.xxxMethod(args);
- [TiUIView & TiViewProxy]
UIViewを作成したい場合、TiUIViewとTiViewProxyを承継して、二つのクラスを組合せて作成必要がある。UIViewを実装するのがTiUIViewを承継する方、呼ぶinterfaceとしてはTiViewProxyを承継する方を利用する。
TiUIViewを承継したクラスにUIViewを定義し、frameSizeChangedに実装する。公開するinterface methodがTiViewProxyに追記する。
@interface ExXxxView : TiUIView {
UiView * mainView;
}
@end
ExXxxView.m
@implementation ExXxxView
-(void)dealloc
{
RELEASE_TO_NIL(mainView);
[super dealloc];
}
-(void)frameSizeChanged:(CGRect)frame bounds:(CGRect)bounds {
if (mainView == nil )mainView = new UiView;
// do something
}
@end
これで、javascriptに利用
var fooView = Module.createView({
"color":"red",
"width":20,
"height":20
});
containerWindow.add(fooView);
複数Viewがある場合、上記のdefault method createView()が使えないと思うので、customizeで自分のcreate methodを作る。
@interface ExXxxViewProxy : TiViewProxy {
}
// customize create method
-(id)createXxxView:(id)args;
@end
ExXxxViewProxy.m
@implementation ExXxxViewProxy
-(id) createXxxView:(id)args {
// return the mainView defined in ExXxxView.h
return [self view];
}
@end
又javascriptに利用
var fooView = Module.createXxxView({
"color":"red",
"width":20,
"height":20
});
containerWindow.add(fooView);
create methodに渡したparametersをproxyにget/setを定義必要がありません、objective-cに直接取ることができる。
NSInteger intValue = [TiUtils intValue:[self.proxy valueForKey:@"key"]];