Ограничение количества детей в проблеме ViewStack - PullRequest
0 голосов
/ 07 марта 2012

У меня есть следующий код для создания ViewStack , который используется в качестве поставщика данных для TabBar :

    <s:TabBar id="objectTab" dataProvider="{vs_objects}"/>
       <mx:ViewStack id="vs_objects" width="100%" />

Я хочу ограничить количествоДети ViewStack , чтобы избежать вкладок, выходящих за пределы экрана, когда пользователь открывает много вкладок, не закрывая их.Я пытаюсь сделать это, удалив самый старый элемент в ViewStack , когда пользователь открывает новую вкладку, а размер ViewStack превышает 9.

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 .Должна быть только одна выбранная вкладка, которая прекрасно работает с обоими подходами выбора дочерних элементов, описанными выше, когда я не удаляю дочерний элемент перед выбором нового.Когда я удаляю ребенка, а затем открываю новую Tab , новая Tab не выбирается должным образом, она только «окрашивается» в выбранный цвет.В этом случае Tab 40 по-прежнему отображается, когда я открываю Tab 41 (более 9 вкладок).Результатом этой проблемы является то, что Tab 41 отображается не полностью.

enter image description here

Кто-нибудь знает, как я могу решить эту проблему, или другой подходдля ограничения количества Tab 's / ViewStack -детей?

ОБНОВЛЕНИЕ: Проблема заключалась в моем AS3-код внутри детей NavigatorContent , который заставил приложение вести себя таким образом.Для решения этой проблемы использовался метод callLater :

Для решения моей проблемы использовался метод callLater , как показано ниже с AdnanПример кода Дорика :

 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 Ответ

1 голос
/ 07 марта 2012

Попробуйте, хотя я не уверен, что это правильное решение, возможно, лучше реализовать какую-то прокрутку.

<?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>

Надеюсь, это поможет:)

...