2012年8月28日星期二

[Titanium]iOSのModule作成

最近ずっと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を作成します。


  1. [TiModule]
  2. defaultとして、TiModuleを承継したクラスが既に自動作成されている。簡単なmethodであれば、このクラスにmember methodを追加して、javascript側から下記の様に使われます。
    var Module = require('xxxModuleId');
    Module.xxxMethod(args); 
    
  3. [TiProxy]
  4. moduleをオブジェクト指向に作りたい場合、TiProxyを承継してクラスを作る作成されたクラスがjavascript側にオブジェクトとして作成られる。referenceに従って、propertyが、member mothodが作った後こうやって利用する。
    var Module = require('xxxModuleId');
    var proxy = Module.createXXXProxy();
    proxy.xxxMethod(args);
    
  5. [TiUIView & TiViewProxy]
  6. UIViewを作成したい場合、TiUIViewとTiViewProxyを承継して、二つのクラスを組合せて作成必要がある。UIViewを実装するのがTiUIViewを承継する方、呼ぶinterfaceとしてはTiViewProxyを承継する方を利用する。
    TiUIViewを承継したクラスにUIViewを定義し、frameSizeChangedに実装する。公開するinterface methodがTiViewProxyに追記する。
  • ExXxxView.h
  • @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を作る。
  • ExXxxViewProxy.h
  • @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"]];
    

没有评论:

发表评论