#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. Большое спасибо за подробности, это была огромная помощь.