Просмотр навигатора скрыть определенную вкладку, а не панель вкладок

#actionscript-3 #apache-flex #flex4.5

#actionscript-3 #apache-flex #flex4.5

Вопрос:

Я пытаюсь выяснить, возможно ли определить навигаторы просмотра и выборочно скрыть некоторые в зависимости от конкретного состояния пользователя?

Например, у меня есть две вкладки навигатора, одна из которых является вкладкой входа, а другая показывает политику пользователей. Я хочу, чтобы вкладка политики была видна только в том случае, если пользователь вошел в систему:

 <s:ViewNavigator id="policyTab" width="100%" height="100%" firstView="views.policy.PoliciesView">
    <s:navigationContent>
        <s:Button id="policyTabButton" label="Policies" click="tabButton_clickHandler(event)" />
    </s:navigationContent>
</s:ViewNavigator>
  

Вкладка входа — это навигатор:

 <s:ViewNavigator id="signInTab" width="100%" height="100%" firstView="views.SignInView">
    <s:navigationContent>
        <s:Button id="signInTabButton" icon="@Embed('images/lockSmall.png')" click="tabButton_clickHandler(event)" />
    </s:navigationContent>
</s:ViewNavigator>  
  

Все, что я исследовал, указывает на то, что я скрываю всю панель вкладок, чего я не хочу делать. Я пытался просто вызвать signInTab.visible = false; но это не работает.

Любая помощь будет оценена.

Ответ №1:

Это правда, что вы не можете скрыть содержимое TabbedViewNavigator, но есть другой способ настроить содержимое, чтобы скрыть вкладки. В принципе, вы можете удалить вкладку из TabbedViewNavigator, чтобы скрыть ее, и повторно добавить, чтобы показать ее снова. Я привел очень простой пример, который, похоже, делает то, что вы просите.

TabbedViewNavTest.mxml:

 <?xml version="1.0" encoding="utf-8"?>
<s:TabbedViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                                  xmlns:s="library://ns.adobe.com/flex/spark"
                                  applicationDPI="160"
                                  preinitialize="preinitializeHandler(event)">
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            import views.Tab2View;

            private static var app:TabbedViewNavigatorApplication;

            public static function adjustTabBar():void {
                if(app.navigators.length > 1) {
                    removeTab2();
                } else {
                    addTab2();
                }
            }

            private static function removeTab2():void {
                app.tabbedNavigator.removeItemAt(1);
            }

            private static function addTab2():void {
                var tab2:ViewNavigator = new ViewNavigator();
                tab2.label = "Tab2";
                tab2.percentWidth = 100;
                tab2.percentHeight = 100;
                tab2.firstView = Tab2View;
                app.tabbedNavigator.addItemAt(tab2, 1);
            }

            protected function preinitializeHandler(event:FlexEvent):void {
                app = this;
            }

        ]]>
    </fx:Script>

    <s:ViewNavigator id="tab1" label="Tab1" width="100%" height="100%" firstView="views.Tab1View"/>
    <s:ViewNavigator id="tab2" label="Tab2" width="100%" height="100%" firstView="views.Tab2View"/>

</s:TabbedViewNavigatorApplication>
  

Tab1View.mxml:

 <?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark"
        title="Tab1">

    <fx:Script>
        <![CDATA[
            protected function showHideButton_clickHandler(event:MouseEvent):void {
                TabbedViewNavTest.adjustTabBar();
            }
        ]]>
    </fx:Script>

    <s:Button id="showHideButton" label="Click Me!" click="showHideButton_clickHandler(event)" />
</s:View>
  

Tab2View — это просто пустое представление, созданное при создании проекта.

Хотя это должно делать то, что вам нужно, мне интересно, есть ли лучший способ добиться того, что вы пытаетесь сделать. Например, в случае, если вы изначально представили вкладку входа, которая исчезает при входе пользователя в систему, вы могли бы создать свое приложение как универсальное приложение с 2 состояниями: notLoggedIn и LoggedIn. В состоянии notLoggedIn у вас есть только представление, отображающее экран входа в систему, или есть представление TabbedViewNavigator, в котором есть вкладки login и policy. В состоянии входа в систему у вас есть отдельный TabbedViewNavigator, в котором доступна только вкладка политики или, возможно, другие вкладки, доступные при входе пользователя в систему. Если вы хотите, чтобы я создал пример того, что я имею в виду, дайте мне знать, и я могу это сделать.

Комментарии:

1. Большое спасибо за подробности, это была огромная помощь.