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.