TabNavigatorの罠

TLifeの設定ダイアログをつくっていてはまったので。
設定ダイアログはTabNavigatorを設置して、VBoxの中にTextInputやらDataGridをおくのだが、どうも最初から表示されないところは、ダイアログがcreationCompleteを返してもロードされていないらしい。つまりcreationCompleteの時点ではidでアクセスできないわけで、creationCompleteで立ち上げたThreadからでは先述のTextInputやDataGridにはアクセスできないのだ。それで延々悩んでたら次のページにあたった。

http://d.hatena.ne.jp/s-ohira/20070715/1184476784

ところが、このタイミングでも内部コンポーネントインスタンス化されていない場合があります。

その具体例がTabNavigatorなどViewStackに関連するものです。TabNavigatorの場合、初期化段階でアクティブでないタブ内のコンポーネントに関しては、その内部までインスタンス化しないようになっています。

なるほど、ということはVBox自体を監視して、initializeとかshowとかされたら呼べるようにすればいいのね。

public function GlobalConfigEventThread(gc : GlobalConfig) 
{
	this.gc = gc;
}
		
protected override function run() : void
{
	if (gc.searchbox) {
		event(gc.searchbox, Event.CHANGE, onChange);
	}
	event(gc.tn1, FlexEvent.SHOW, onShow);
	event(gc, Event.CLOSING, onClosing);
}
		
private function onShow(e : FlexEvent) : void
{
	next(run);
}

gcはmx:Window, tn1はVBox, searchboxは件のTextInput.