0

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);
 }
4

1 に答える 1

1

これが正しい解決策かどうかはわかりませんが、これを試してみてください。おそらく、ある種のスクロールを実装する方が良いでしょう。

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">

    <fx:Script>
        <![CDATA[
            import mx.core.Container;

            private var counter:int = 1;

            protected function openTab():void
            {
                var form:Container = new Container();
                form.name = "Tab " + counter++;
                vs_objects.addChild(form);
                if (vs_objects.numElements > 10)
                    vs_objects.removeElementAt(0);
                vs_objects.selectedChild = form;
            }

        ]]>
    </fx:Script>

    <s:TabBar id="objectTab" top="32" labelField="name" dataProvider="{vs_objects}"/>
    <mx:ViewStack id="vs_objects" width="100%" />
    <s:Button label="addTab" click="openTab()" />
</s:Application>

それが役立つことを願っています:)

于 2012-03-07T12:35:51.320 に答える