1

我在 Flash Builder 4.5 中为 android 和 iOS 制作一个移动应用程序,并使用 itemRenderer 和 iconitemrenderer 类为我的应用程序制作一个选项列表。出于某种原因,我无法让它们可点击,或者定义每个被点击时要执行的操作。基本上,我的目标是使用 FB 的“视图”,当点击一个项目时,切换到一个新视图。这是我正在使用的代码:

<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:ms="libs/MessageBox-digitalRetro">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:actionContent>
        <s:Button id="signin" label="Sign in" click="onSignIn(event)"/>
    </s:actionContent>
        //code for the clicking of the sign in button
    <fx:Script>
        <![CDATA[
            protected function onSignIn(event:Event):void
            {

            }
        ]]>
    </fx:Script>
    <s:List height="100%" width="100%">
        <s:itemRenderer>
            <fx:Component>
                <s:IconItemRenderer height="100" labelField="name" 
                                    iconField="photo" iconHeight="80" 
                                    iconWidth="80" messageFunction="getMessage">
                    <fx:Script>
                        <![CDATA[
                            import spark.components.NavigatorContent;
                                                    //this first method works
                            protected function getMessage(o:Object):String
                            {
                                return o.message;
                            }
                        ]]>
                    </fx:Script>
                </s:IconItemRenderer>
            </fx:Component>
        </s:itemRenderer>
        <s:dataProvider>
            <s:ArrayCollection>
                <fx:Object name="Projects" photo="@Embed('libs/ProjectsIcon2.png')" message="Learn more about what we're working on" clickfn="views/Projects"/>
                <fx:Object name="Locate Office" photo="@Embed('libs/google-maps-icon.png')" message="Find directions to our nearest office" clickfn=""/>
                <fx:Object name="Contact Us" photo="@Embed('libs/gmailicon.png')" message="Let us know your thoughts!" clickfn=""/>
                <fx:Object name="About Us" photo="@Embed('libs/info-icon.png')" message="" clickfn=""/>
            </s:ArrayCollection>
        </s:dataProvider>
            <s:change>
        <![CDATA[
                // NEW!!!
            var ClassReference:Class = getDefinitionByName(event.currentTarget.selectedItem.clickfn) as Class;
            navigator.pushView(ClassReference);
        ]]>
    </s:change>
    </s:List>
</s:View>

编辑:我添加了“更改”标签,现在可以编译,但我收到一条错误消息:

ReferenceError:错误 #1065:未定义变量项目。在 global/flash.utils::getDefinitionByName() 在 vi​​ews::MainHomeView/___MainHomeView_List1_change()[C:\Users\jlehenbauer\Adobe Flash Builder 4.5\Metters Inc\src\views\MainHomeView.mxml:56] 在 flash.events ::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at mx.core::UIComponent/dispatchEvent()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core \UIComponent.as:13128] 在 spark.components::List/commitSelection()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\List.as:1205] 在 spark.components .supportClasses::ListBase/commitProperties()[E:\dev\4.5.1\frameworks\projects\spark\src\spark\components\supportClasses\ListBase.as:939] 在 spark.components::List/commitProperties() [E:\dev\4.5.

4

4 回答 4

1

我在 Flash Builder 4.5 中为 android 和 iOS 制作一个移动应用程序,并使用 itemRenderer 和 iconitemrenderer 类为我的应用程序制作一个选项列表。

实际上,根据您在示例中显示的代码,您没有使用ItemRenderer类;只是IconItemRenderer类。你看到的语法是这样的:

是一种语法,用于将组件的属性定义为 MXML 中的子项。引用List组件的itemRenderer属性;它没有引用 ItemRenderer 类。

也就是说,错误似乎是您试图引用一个字符串clickfn="Projects",就好像它是一个类一样。因此,您会收到类型转换错误。如果您指定完整的类路径,您可能会有更好的运气。

此外,您的三个项目没有定义 clickFn;所以他们可能会抛出类似的错误。

于 2011-06-29T13:25:31.423 回答
1

您可以通过执行以下操作来简化 JacobL 答案中的更改处理程序逻辑:

<s:List id="list1" height="100%" width="100%" change="navigator.pushView(list1.selectedItem.nextView)">
    <s:itemRenderer>
        <fx:Component>
            <s:IconItemRenderer labelField="name"/>
        </fx:Component>
    </s:itemRenderer>
    <s:dataProvider>
        <s:ArrayList>
            <s:DataItem name="Projects" message="Learn more about what we're working on" nextView="{views.Projects}" />
            <s:DataItem name="Locate Office" message="Find directions to our nearest office" nextView="{views.Locate}" />
            <s:DataItem name="Contact Us" message="Let us know your thoughts!" nextView="{views.ContactUs}" />
            <s:DataItem name="About Us" message="" nextView="{views.AboutUs}" />
        </s:ArrayList>
    </s:dataProvider>
</s:List>
于 2011-07-13T05:16:56.770 回答
1

您可以通过执行上述建议来摆脱条件,如下所示:

<pre>
<s:dataProvider>
<s:ArrayList>
    <s:DataItem name="Projects" message="Learn more about what we're working on"   nextView="{views.Projects}" />
    <s:DataItem name="Locate Office" message="Find directions to our nearest office" nextView="{views.Locate}" />
    <s:DataItem name="Contact Us" message="Let us know your thoughts!" nextView="{views.ContactUs}" />
    <s:DataItem name="About Us" message="" nextView="{views.AboutUs}" />
    </s:ArrayList></s:dataProvider>

<s:change>
navigator.pushView(event.currentTarget.selectedItem.nextView);
</s:change>

于 2011-08-28T02:28:46.940 回答
0

弄清楚了。这是一个解决方案:

<s:List height="100%" width="100%">
    <s:itemRenderer>
        <fx:Component>
            <s:IconItemRenderer height="100" labelField="name" 
                                iconField="photo" iconHeight="80" 
                                iconWidth="80" messageFunction="getMessage">
                <fx:Script>
                    <![CDATA[
                        import spark.components.NavigatorContent;
                        protected function getMessage(o:Object):String
                        {
                            return o.message;
                        }
                    ]]>
                </fx:Script>
            </s:IconItemRenderer>
        </fx:Component>
    </s:itemRenderer>
    <s:dataProvider>
        <s:ArrayCollection>
            <fx:Object name="Projects" photo="@Embed('libs/ProjectsIcon2.png')" message="Learn more about what we're working on">
            </fx:Object>
            <fx:Object name="Locate Office" photo="@Embed('libs/google-maps-icon.png')" message="Find directions to our nearest office">
            </fx:Object>
            <fx:Object name="Contact Us" photo="@Embed('libs/gmailicon.png')" message="Let us know your thoughts!">
            </fx:Object>
            <fx:Object name="About Us" photo="@Embed('libs/info-icon.png')" message="">
            </fx:Object>
        </s:ArrayCollection>
    </s:dataProvider>
    <s:change>
              //these if statements were the solution i used. rough, but works well
        <![CDATA[
            if(event.currentTarget.selectedItem.name == "Projects"){navigator.pushView(Projects);}
        if(event.currentTarget.selectedItem.name == "Locate Office"){navigator.pushView(Locations);}
        if(event.currentTarget.selectedItem.name == "Contact Us"){navigator.pushView(Contact);}
        if(event.currentTarget.selectedItem.name == "About Us"){navigator.pushView(About);}
        ]]>
    </s:change>
</s:List>
于 2011-06-29T16:25:22.427 回答