限制ViewStack问题中的子项数

时间:2012-03-07 09:26:37

标签: actionscript-3 flex viewstack

我有以下代码来创建 ViewStack ,它用作 TabBar 的数据提供者:

    <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 41(超过9个选项卡)时,仍会显示 Tab 40。此问题的结果是 Tab 41未完全呈现。

enter image description here

有谁知道我如何解决这个问题,或者有不同的方法来限制 Tab 的/ ViewStack -children的数量?

更新 问题是我的孩子的 NavigatorContent 中的AS3代码导致应用程序以这种方式运行。解决方案是使用 callLater 方法:

我的问题的解决方案是使用 callLater 方法,如下所示 Adnan Doric 的代码示例:

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

1 个答案:

答案 0 :(得分: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>

希望有所帮助:)