1

現在、Flashbuilder 4.6 でモバイル アプリケーションを作成しています。ユーザーが選択したメニュー項目に基づいて、ユーザーをビューにプッシュしたいと考えています。以下のコードは、選択したリスト項目から文字列をクラス オブジェクトに変換し、それを pushView のパラメーターに渡す方法を示しています。

<fx:Script>
    <![CDATA[
        import mx.collections.*;            
        import spark.components.SplitViewNavigator;
        import spark.components.ViewNavigator;
        import spark.events.IndexChangeEvent;
        import spark.events.ViewNavigatorEvent;
        import spark.managers.PersistenceManager;
        import spark.skins.mobile.SplitViewNavigatorSkin;

        public var menuAC:ArrayCollection;          
        public var j_array:Array = [{label:"Home", data:"NLView"}, 
            {label:"All Jobs", data:"JList"}, 
            {label:"Company Profiles", data:"SView"}, 
            {label:"Search By Sector", data:"JView"}];


        protected function list_changeHandler(event:IndexChangeEvent):void
        {
            var selectedItem:String = new String(list.selectedItem.data);
            //trace("Selected Item = " + selectedItem);
            var splitNavigator:SplitViewNavigator = navigator.parentNavigator as SplitViewNavigator;
            var detailNavigator:ViewNavigator = splitNavigator.getViewNavigatorAt(0) as ViewNavigator;
            splitNavigator.hideViewNavigatorPopUp();

            if(list.selectedItem.data == "NewListView")
            {
                var myClass:Class = getDefinitionByName(selectedItem) as Class;                 
                trace("View Class = " + myClass);
                detailNavigator.pushView(myClass);
            }
            else if(list.selectedItem.data)
            {

            }


        }

        protected function view1_viewActivateHandler(event:ViewNavigatorEvent):void
        {

            if(data.view == "JSFilt")
            {
                menuAC = new ArrayCollection(j_array);  
            }

            list.dataProvider = menuAC;
            // TODO Auto-generated method stub
            var splitNavigator:SplitViewNavigator = navigator.parentNavigator as SplitViewNavigator;
            var detailNavigator:ViewNavigator = splitNavigator.getViewNavigatorAt(1) as ViewNavigator;
            splitNavigator.hideViewNavigatorPopUp();
        }


    ]]>
</fx:Script>
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<s:BitmapImage width="100%" height="100%" source="@Embed('assets/images/sidebg.png')" fillMode="repeat"/>
<s:BitmapImage horizontalCenter="0" top="5" width="175" height="130" source="@Embed('assets/images/G_S_Logo_170x130.png')"/>

<s:List id="list" left="0" right="0"
        color="0xFFFFFF" contentBackgroundColor="0x101010"
        fontSize="20" width="280"
        alternatingItemColors="[0x202020,0x2a2a2a]"
        top="140" horizontalCenter="0" bottom="200"
        downColor="0x70B2EE"
        selectionColor="0x70B2EE"
        change="list_changeHandler(event)"> 
    <s:itemRenderer>
        <fx:Component>
            <s:IconItemRenderer messageStyleName="myFontStyle" fontSize="22" height="70" 
                                labelField="label"
                                messageField="" 
                                />
        </fx:Component>
    </s:itemRenderer>       
</s:List>

また、次のコマンドを使用してみましたが、これも機能しませんでした:

var viewClass:Class = Class(getDefinitionByName(getQualifiedClassName(selectedItem)));

pushView メソッドが文字列を受け入れないため、リストで選択された値を見て、その文字列名を使用してアプリをビューにプッシュする方法を知っている人はいますか??


提案していただきありがとうございます。クラスを配列に追加してから、それを pushView に渡すというアイデアが気に入っています。私は過去にそれを試しましたが、うまくいかなかったので、以下のコードであなたの方法を試しました:

public var jobs_array:Array = [{label:"Home", data:"NewListView", class:NewListView},
                {label:"All", data:"JList"}, 
                {label:"C Prof's", data:"SView"}, 
                {label:"S By S", data:"JSView"}];

ご覧のとおり、最初の行で提案したことを実装しようとしましたが、次のエラーが発生します。

1084: Syntax error: expecting colon before rightbrace.
1084: Syntax error: expecting identifier before class.
1084: Syntax error: expecting identifier before rightbrace.

これは単純な構文のはずですが、わかりません。誰か助けてもらえますか?

4

4 に答える 4

2
var imageClass:Class=getDefinitionByName("com.robaldred.composers."+imgclass) as Class;

次のようにパッケージ名を追加してください。com.robaldred.composers.

于 2012-12-14T06:46:15.287 に答える
0

はい..これは、文字列 var str:String="roof"; を使用して、spark ビュースタックの選択された子をバインドするための答えです。viewstack.selectedChild=NavigatorContent(viewstack.getChildByName(str));

于 2012-12-14T10:31:44.533 に答える
0

クラス自体への参照をデータに入れてみませんか。それを表すために文字列を使用することについて心配する必要はありません。

データ項目は次のようになります。

var data:Array = [
{ label: "Item 1", class: ClassToUseForItem1 },
{ label: "Item 2", class: ClassToUseForItem2 },
{ label: "Item 3", class: ClassToUseForItem3 } ];

そして今、あなたはできるpushView(list.selectedItem.class)

于 2012-04-28T17:31:53.497 に答える
0

getDefinitionByName(selectedItem)ほとんどあなたが望むものですが、完全ではありません。参照してください、selectedItemあなたの配列からのアイテムの1つです。たとえば{label:"All Jobs", data:"JList"}、だけではありません"JList"

getDefinitionByName(getQualifiedClassName(selectedItem))getQualifiedClassNameの完全修飾クラス名を返すため、絶対に必要なものではありませんselectedItem。この場合、それは になりますObject。次にgetDefinitionByName、Object クラスを返します。


getDefinitionByName(selectedItem.data)あなたのためにうまくいくはずです。たとえば、 でselectedItem.dataある必要があり、JList クラス オブジェクトを返す必要があります。JListgetDefinitionByName

于 2012-04-27T19:15:37.510 に答える