A classe TabNavigator, assim como sua parente ViewStack primitiva, não cria todas suas abas de uma vez. Por motivos de performance, ela só cria as abas que são necessárias, quando elas ficam visíveis. Por isso as coisas funcionam quando vc clica em todas as abas.
Mas vamos a resposta prática: existe um atributo do TabNavigator chamado creationPolicy, que por padrão é auto, ou seja, se comporta como já descrevi. Se vc setar ele como all, todas suas abas serão criadas e vc vai conseguir fazer o que deseja sem clicar em todas, pagando o preço de ter as telas construidas logo quando rodar o TabNavigator.
Tome cuidado também com o combo quando vc alterar seu dataProvider. Quando vc seta um novo dataProvider, ele não olha o selectedItem pra continuar com o item selecionado, acarretando em alguns problemas. Eu até criei um outro combo pra evitar esse problema.
Segue o código:
package br.com.nuccitelli.component {
import flash.events.Event;
import mx.binding.utils.BindingUtils;
import mx.utils.ObjectUtil;
import spark.components.DropDownList;
public class DropDowListWithMemory extends DropDownList {
private var _selectedItemInMemory:Object=null;
public function DropDowListWithMemory() {
super();
BindingUtils.bindSetter(dataProviderHandler,this,[ "dataProvider","length" ]);
}
private function dataProviderHandler(obj:Object=null):void {
if(_selectedItemInMemory) {
for each(var item:Object in this.dataProvider) {
if(this.equals(item,_selectedItemInMemory)) {
this.selectedItem=item;
break;
}
}
}
}
/**
* The selectedItemInMemory sets selectedItem in 2 ocasions:
* 1) When you set selectedItemInMemory and data provider has an equals object
* 2) When dataProvider change and has an object equals to selectedItemInMemory
**/
public function get selectedItemInMemory():Object {
return _selectedItemInMemory;
}
/**
* The selectedItemInMemory sets selectedItem in 2 ocasions:
* 1) When you set selectedItemInMemory and data provider has an equals object
* 2) When dataProvider change and has an object equals to selectedItemInMemory
**/
public function set selectedItemInMemory(value:Object):void {
_selectedItemInMemory=value;
dataProviderHandler();
}
private function equals(item:Object,item2:Object):Boolean {
return ObjectUtil.compare(item,item2)==0;
}
}
}
código do teste unitário:
package br.com.nuccitelli.component {
import flexunit.framework.Assert;
import mx.collections.ArrayCollection;
public class DropDowListWithMemoryTest {
[Test]
public function testSelectedItemWithExistingDataProvider():void {
var combo:DropDowListWithMemory=new DropDowListWithMemory();
combo.dataProvider=new ArrayCollection([ "A" , "B" , "C" ]);
Assert.assertUndefined(combo.selectedItem);
combo.selectedItemInMemory="B";
Assert.assertEquals("B" , combo.selectedItem);
}
[Test]
public function testSelectedItemWithOutExistingDataProvider():void {
var combo:DropDowListWithMemory=new DropDowListWithMemory();
combo.dataProvider=new ArrayCollection([ "A" , "B" , "C" ]);
Assert.assertUndefined(combo.selectedItem);
combo.selectedItemInMemory="D";
Assert.assertUndefined(combo.selectedItem);
combo.dataProvider=new ArrayCollection([ "A" , "B" , "C" , "D" ]);
Assert.assertEquals("D" , combo.selectedItem);
}
}
}
O código já está usando o DropDownList do Flex 4, pra vc portar pro 3, basta trocar a classe por combo.
Enfim, qq dúvida é só perguntar, e se precisar de um curso, recomendo a Eng em SP e, puxando a sardinha, a Nuccitec em São José dos campos.
[]s