Titanium Module Development のメモです。

参考

Module の種類

Module として作成できるものは次の通り。

種類 説明
Proxy ネイティブコード(Objective-C)と JavaScript の橋渡しをするクラス
ViewProxy View のレンダリングに対応する Proxy
View Titanium で描画できる UI コンポーネントを表すクラス
Module Module セットを表すクラス

Module クラスはモジュールとして提供するパッケージにひとつだけ存在し、Proxy、ViewProxy、View は Module パッケージ内にいくつ存在してもよい。以下、モジュール名を com.hamasyou と定義するものとする。クラス名等のプレフィックスにつく ComHamasyou はモジュール名を表す。

Proxy

Proxy クラスは TiProxy を継承して作成する。クラス名を "Module 名 + クラス名 + Proxy" にすることで、JavaScript から次のように呼び出すことができるようになる。例えば、ComHamasyouMyOriginalProxy という名前で Proxyクラスを作成すると次のようになる。

JavaScript のコード

var my_module = require("com.hamasyou");
var obj = my_module.createMyOriginal({ ... });

ComHamasyouMyOriginalProxy.h

#import "TiProxy.h"
@interface ComHamasyouMyOriginalProxy : TiProxy {
}
@end

ComHamasyouMyOriginalProxy.m

#import "ComHamasyouMyOriginalProxy.h"
@implementation ComHamasyouMyOriginalProxy
@end

Proxy Methods のシグネチャ

- (id)methodName:(id)args
マクロの内容は要確認。Titanium SKD 1.4.0 で内容が変わっているっぽい。。。 args 引数は NSArray になっている。実際に引数がひとつの場合には ENSURE_SINGLE_ITEM(args, type) のマクロを使って単一引数にする。 ENSURE_UI_THREAD etc…

TiUtils を使ってメソッド引数を型に変換する

(id)args で受け取った引数は、TiUtils クラスを使って型に変換できる。

#import "TiUtils.h"
NSInteger f = [TiUtils intValue:args];
NSString *s1 = [TiUtils stringValue:arg];
NSString *s2 = [TiUtils stringValue:@"key" properties:dict def:@"default"];

Proxy のプロパティ

@property を使って Proxy クラスのプロパティを宣言することで、JavaScript からプロパティを参照できる。

@property (nonatomic, readwrite, assign) NSString *propertyName;

getter/setter を用意して、任意の処理を追加することもできる。

- (void)setPropertyName:(id)value {
}
 
- (id)propertyName {
  return propertyName;
}

createMyOriginal コンストラクタメソッドの引数にプロパティを渡した場合、setter メソッドが定義されていれば setter メソッドが、定義されていなければ dynprops という NSDictionary にプロパティが設定される。

var obj = my_module.createMyOriginal({ name: "hamasyou" });
obj.age = 28;

設定されたプロパティをコード内で使用する場合には、valueForKeyvalueForUndefinedKey を使う。valueForKey は getter から、valueForUndefinedKey は dynprops からそれぞれ値を取り出す。