読者です 読者をやめる 読者になる 読者になる

TitaniumにてViewを継承したクラスを作る

TitaniumではViewの生成は
Ti.UI.create~~という専用のメソッドを使うため、prototypeを使った継承などが使えません*1

ただ用途ごとにViewを継承したクラスを定義していきたかったので、ぱっと見継承したっぽく見せかけるメソッドを用意してみました。

関数

//app.js
var root = this;
//ViewもしくはWindowなどのUIオブジェクトを継承したクラスを作成
function createViewClass( parentView , props ){
	var func = function(){
		var view = Ti.UI["create"+parentView]( arguments[0] );
		for( var i in props ){
			view[i] = props[i];
		}
		if( view['__construct'] ){ view.__construct.apply(view,null); }
		return view;
	}
	return func;
}
//パッケージを生成。
function createPackage( ns ){
	var nsList = ns.split('.');
	var currentObj = root;
	while( n = nsList.shift() ){
		if( currentObj[n] == undefined ){
			currentObj[n] = {};
		}
		currentObj = currentObj[n];
	}
}

サンプル

createPackage('toytools.test');

//create extended view(or window) class
toytools.test.TestImageView = createViewClass(
	'ImageView',
	{
		_var1:null,
		__construct:function(  ){
			//コンストラクタ
			//newの時の引数はViewのコンストラクタが持っていってしまうため、引数は持てない
			//第二引数以降を使うことも考えたけどとりあえず無しで
		},
		setVar:function( var1 ){
			this._var1 = var1;
		},
		getVar:function(){
			return this._var1;
		}
	}
);

//
var image = new toytools.test.TestImageView({url:'http://k.yimg.jp/images/top/sp/logo.gif'});
var win = Ti.UI.createWindow();
win.add( image );
win.open();
image.setVar('hogehoge');
alert( image.getVar() );

*1:new Ti.UI.ImageView()みたいなことはできない