1

添付のコード例 (疑似コード) はコンパイルされますが、次の実行時エラーがスローされます。

TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/getChildIndex()
    at mx.core::Container/getChildIndex()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\core\Container.as:2409]
    at mx.containers::ViewStack/set selectedChild()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\containers\ViewStack.as:557]


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            [Bindable]
            private var targetViewName:String = "content";
        ]]>
    </mx:Script>

    <mx:ViewStack id="viewStack" width="100%" height="100%" 
        selectedChild="{Container(viewStack.getChildByName(targetViewName))}">
        <mx:Panel id="welcome" width="100%" height="100%" />

        <mx:Panel id="content" width="100%" height="100%" />
    </mx:ViewStack>
</mx:Application>

selectedChild を設定する関数を呼び出さなくても、これを機能させる方法はありますか?

ありがとう。

4

6 に答える 6

3

selectedChild が起動されると、viewStack には子が追加されないため、NullPointerException がスローされます。

以下が機能します。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            import mx.core.Container;
            [Bindable]
            private var targetViewName:String = "content";

            private function onClick() : void
            {
                viewStack.selectedChild = Container(viewStack.getChildByName(targetViewName)) ;
            }
        ]]>
    </mx:Script>

    <mx:ViewStack id="viewStack" width="100%" height="100%" >
        <mx:Panel id="welcome" width="100%" height="100%"  title="welcome"/>

        <mx:Panel id="content" width="100%" height="100%" title="content" />
    </mx:ViewStack>

    <mx:Button click="onClick()" label="click" />

</mx:Application>
于 2008-12-01T00:13:32.723 に答える
0

私の推測では、この時点ではビュースタックの子がまだ作成されていないときにバインディングが初期化時に評価されるため、これは機能しないと思います。CreationPolicyを「all」に設定しても、問題は引き続き発生します。

ビュースタック(およびおそらくその子)が作成されるときに、targetViewNameへのバインディングを設定する必要があります。

于 2008-11-26T19:28:52.720 に答える
0

これを試しました:

selectedChild="{this[targetViewName]}">

/ Niels

于 2008-11-26T07:22:35.527 に答える
0

ターゲットが表示リストに表示されたら、selectedChild プロパティを設定します。これを試して:

<mx:TabNavigator id="viewStack" width="100%" height="100%" creationPolicy="all" >
    <mx:Panel id="welcome" width="100%" height="100%" label="welcome" />

    <mx:Panel id="content" width="100%" height="100%" label="content" addedToStage="viewStack.selectedChild = this" />
</mx:TabNavigator>

本当にselectedChildをバインドしたい場合は、選択したいパネルを返すバインド可能な関数を作成しますが、それがviewStackの子である場合に限ります。

于 2008-11-26T20:38:57.243 に答える
0

すみません、/Niels、それはうまくいきません。このコードをコンパイルしてみると、selectedChild が変更されないことがわかります (また、コンパイルの警告が表示されます)。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            [Bindable]
            private var targetViewName:String = "content";
        ]]>
    </mx:Script>

    <mx:TabNavigator id="viewStack" width="100%" height="100%" creationPolicy="all" 
        selectedChild="{this[targetViewName]}">
        <mx:Panel id="welcome" width="100%" height="100%" label="welcome" />

        <mx:Panel id="content" width="100%" height="100%" label="content" />
    </mx:TabNavigator>
</mx:Application>
于 2008-11-26T14:44:50.640 に答える
0
<mx:Script>
    <![CDATA[
        import models.ModelLocator;

        [Bindable]
        private var model:ModelLocator = ModelLocator.getInstance();
    ]]>
</mx:Script>

<mx:ViewStack id="videoViewStack" width="100%" height="100%" selectedChild="{this[model._videoViewStack]}" >
    <viewsVideos:AllVideos id="AllVideos" label="Videos"/>
    <viewsVideos:MainVideo id="MainVideo" label="Video"/>
</mx:ViewStack>

これは文字列変数をバインドします。警告は表示されますが、機能します

于 2009-04-19T16:25:59.123 に答える