TabBarのデータプロバイダーとして使用されるViewStackを作成する次のコードがあります。
<s:TabBar id="objectTab" dataProvider="{vs_objects}"/>
<mx:ViewStack id="vs_objects" width="100%" />
ユーザーがタブを閉じずに多くのタブを開いたときに、ViewStackの子の数を制限して、タブが画面から出ないようにしたいと考えています。ユーザーが新しいタブを開き、ViewStackのサイズが 9 を超えたときに、 ViewStackの最も古い要素を削除することで、これを実行しようとしています。
private function openTab(object:Object): void {
//Create a new NavigatorContent(form) and add it to the ViewStack
........
vs_objects.addChild(form);
if(vs_objects.numChildren > 9) {
vs_objects.removeChildAt(0);
}
//vs_objects.selectedChild = form;
vs_objects.selectedIndex = (vs_Tiltaksbanken.numChildren -1);
}
下の画像は私の問題を示しており、濃い灰色が選択されたTabを示しています。新しいタブを選択する前に子を削除しない場合、上記の両方の子選択アプローチで完全に正常に機能する、選択されたタブが1つだけあるはずです。子を削除してから新しい Tab を開くと、新しい Tabが正しく選択されず、選択した色で「ペイント」されるだけです。この場合、タブ41 (9 個のタブを超える) を開くと、タブ40 が引き続き表示されます。この問題の結果、タブ41 が完全にはレンダリングされません。
この問題を解決する方法を知っている人はいますか、またはTabの/ ViewStack -children の数を制限するための別のアプローチがありますか?
更新:問題は、アプリケーションがこのように動作する原因となった子NavigatorContent 内の AS3 コードでした。解決策は、 callLaterメソッドを使用することでした。
私の問題の解決策は、 Adnan Doricのコード例で以下に示すようにcallLaterメソッドを使用することでした:
protected function openTab():void
{
var form:Container = new Container();
form.name = "Tab " + counter++;
vs_objects.addChild(form);
vs_objects.selectedChild = form;
callLater(removeTab);
}
private function removeTab(): void {
if (vs_objects.numElements > 10)
vs_objects.removeElementAt(0);
}